一维数组和一维指针
1.一维数组
(1)数组的初始化
一维数组是数组里面最基础的部分,也是最简单的。比如要存放数字1到10。那么可以定义应该大小为10的整型数组:
#include
#include
int main() {
int a[10]; //定义数组,但是没有初始化 memset(a,0,10*sizeof(int)); //初始化数组。memset(1.数组名 2.数组元素的初始化值3.给多少个元素初始化,记得*sizeof(数组类型)) //这样就把数组a里面的10个元素初始化为0了。memset函数的头文件是#include
for(int i=0;i<10;i++) //给a[0]到a[9]分别赋值1到10 a[i]=i+1; for(int i=0;i<10;i++) //依次输出1,2,3,4,5,6,7,8,9,10 printf("a[%d]=%d\n",i+1,a[i]); return 0; }
一般来说,数组都需要初始化,初始化的方式有很多种。但是有一种赋值方式是不行的。就是当n是未知量的时候不能写成int a[n],即计算机在可以识别n之前,如果有int a[n];这样的语句是错误的。而一般犯这种错误的都是想当然:既然我开辟数组空间总是要给中括号里面的数赋值,那为什么不直接写一个n,用的时候临时给n赋值呢 :下面这种就是典型的错误写法
#include
#include
int main() {
int n; int a[n]; //报错 scanf("%d",&n); for(int i=0;i<n;i++) a[i]=i+1; for(int i=0;i<n;i++) printf("%d",a[i]); return 0; }
上面已经说了,在n不可以被编译器识别的时候,int a[n] 这种写法是不行的。就比如,我要拿桶子接水,我要去拿不同大小的桶子,在我准备拿起桶子之前,你必须告诉我要接多少水,不然我怎么知道要拿多大的桶子?相反的,如果你告诉了我要接多少水,我就知道拿多大的桶子了.开辟数组也是,你不提前告诉编译器要开多大的空间,等你开辟完再去说是不是就晚了?所以在编译器没有识别n之前,是开辟不了空间的
#include
#include
int main() {
int n; scanf("%d",&n); int a[n]; //正确,但是vs会报错,devc可以 for(int i=0;i<n;i++) a[i]=i+1; for(int i=0;i<n;i++) printf("%d",a[i]); return 0; }
那么这样就是可以是正确的,(这是在devc++,c++11标准下可以成功运行,但是用vs运行不了)。但是不推荐这样写,下面会说。
#include
int a[10]; //在主函数外面定义数组,可以不需要人为初始化,系统自动将所有元素初始化为0 int main() {
for(int i=0;i<10;i++) a[i]=i+1; for(int i=0;i<10;i++) printf("%d ",a[i]); return 0; }
- 使用memset函数,上面写了。
#include
//int a[10]; //在主函数外面定义数组,可以不需要人为初始化,系统自动赋值为0 int main() {
int a[10]={
0}; //如果需要全部初始化为0,那么就写一个0,后面的自动会补0 for(int i=0;i<10;i++) a[i]=i+1; for(int i=0;i<10;i++) printf("%d ",a[i]); return 0; }
4.还可以这样写:int a[]={1,2,3,4,5};等价于: int a[5]={1,2,3,4,5}。
(2)数组之间的赋值
我 新手在刚开始学数组的时候举一反三,心想,int a=5; int b=3;a=b;
那么a=3。嗯,心里感觉悟到了些东西。那么int a[10]={1,2,3,4,5,6,7,8,9,0},int b={0}。b=a;然后用一个for循环输出数组b。然后报错。。这说明数组是不能通过数组名赋值的,下面用代码说明
#include
//int a[10]; //在主函数外面定义数组,可以不需要人为初始化,系统自动赋值为0 int main() {
int a[10]={
0}; int b[10]={
0}; for(int i=0;i<10;i++) //给a赋值 a[i]=i+1; //b=a;//错误,尝试将数组a直接全部复制给b for(int i=0;i<10;i++) //给b赋值 b[i]=a[i]; //一个一个赋值,正确 for(int i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); for(int i=0;i<10;i++) printf("%d ",b[i]); return 0; }
2.一维指针
(1)什么是指针
如果在程序中定义一个整型变量a,在对程序进行编译的时候,系统会给a分配内存,int型变量是分配4个字节,而内存中的每一个字节都有一个对应的编号,这个编号就是这个变量的地址。打个比方。这个“地址”(也就是编号)就像房间门牌号,在这个房间号里面的人就是内存存放的数据。假设int a=5; a的地址是1000,那么找到编号为1000的内存地址,这个内存地址存放了一个4个字节的变量,通过计算存放的是5。
、
我们将地址形象地称作“指针”,通过地址可以找到单元变量,也就是通过指针可以找到单元变量。
(2)一维指针的基本使用
如果定义了一个int型变量a,要想通过指针指向这个变量;
int a=5; int *p; //定义一个指向整型变量的指针 p=&a; //把a的地址,也就是&a给p printf("%d",*p); //输出5,p是a的地址,那么*p自然就不是地址,而是这个地址存放的内容 printf("%d",a); //输出5
值得一提的是,相同类型的指针只能和相同类型的变量配套使用
char a='s'; int *p; p=&a; //这是错误的,因为p是int*型的,而&a是char*型的。 //a是char型的,那么&a就是char*型的.p是int*型的,那么*p就是int型的,自己慢慢体会一下这种变换。
既然指针指向了变量,那么可以通过指针改变变量的值吗?
#include
int main() {
int a=5; int *p; p=&a; printf("*p=%d\n",*p); *p=3; printf("*p=%d\n",*p); printf("a=%d",a); return 0; }
输出是5,3,3.发现是可以改变的。这说明这个时候a和*p已经是等价关系了
后言
这是小刘第一篇博客,试试这个文本编译器怎么写(还是不熟练),写的不是很好,滥竽充数写一点基础知识,讲的不是很深入,建议参考为主。以后会定期更新一些博客的个人见解,一起加油!!
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203423.html原文链接:https://javaforall.net
