这一篇文章揭秘指针和数组名的关系~~~
(1)、数组的定义
int array[10];//定义了一个数组array,并且初始化都为0,数组为{0,0,0,0,0} int array[10]={1,2};//定义了一个数组array,并且初始化都为0,但是第一,第二个元素又被改写为1和2,最后数组为{1,2,0,0,0}
int array[];//该定义错误,没有指定需要多少的内存空间,系统无法分配空间
定义一个数组时的内存分配是不是也和定义一个int型数据或者定义一个char型字符时的内存分配一样呢?
大体是一样的,当定义一个数组时,系统为这个数组分配 n*sizeof(int) 个字节的内存空间(n为数组的长度),并且我们给这个数组起了一个名字array,但是当我们执行下边的语句
cout<<array<<endl;
输出的并不是整个数组,而是一个十六进制的数。这说明array并不代表这个数组整个内存空间,array是一个地址
当我们取这个地址中的内容时,发现 *array 是数组中的第一个数字
cout<<*array<<endl;//输出数组中的第一个数字
所以array有两层含义:
1、这个数组的名字
2、一个地址,这个地址就是系统分配给这个数组的内存空间的首地址(也就是数组中第一个数字的地址),那么 *array 就代表数组中的第一个数,如果数组定义为int array[10]={1,2,3,4,5,6,7,8,9,0}, 那么 *array 就等于1
为什么会这样呢?为什么定义int变量 a 后,a就代表内容,定义数组 array 后,array 就代表地址了呢?
可以这么理解,定义 int 变量的时候,变量代表的只是一个数据单位(一个数啦,一个字符啦),我们通过使用 a 就可以得到具体的数据,从而加加减减,很方便吧~;相反,如果我们把 a 也定义为像数组一样是个地址,那么每次我们取这个数字都要 *a 才能取到数字,好麻烦有没有~~~~~
但是定义数组的时候,里边有好多数啊,如果我们使用 array 就得到了一串的所有的数字,而我们想要用其中的第一个数字,第二个数字等等就没办法得到了,怎么加加减减,我们想要得到的是一个数呀;再者,如果 array 代表数组的首地址,*array就得到了第一个数字,然后通过首地址 array 计算第二个数字,第三个数字,第四个数字等等的地址(array+1, array+2, array+3 等等),然后 *(array+i) 就得到数组中所有的数字啦,很方便有没有~~~,要是 array 代表的是第一个数字的内容,取第二个数字的时候要对 array 先进行取地址 &array,再进行地址运算 (&array+i),再根据地址取数字 (*(&array+i)) ,很麻烦有没有 ~~~~~
(2)、数组名和指针遍历数组
最直接访问数组元素的方法
int array[10]={1,2,3,4,5,6,7,8,9,0}; for(int i=0;i<10;i++){ cout<<array[i]<<endl; }
我们也可以这样
for(int i=0;i<10;i++){ cout<<*(array+i)<<endl; }
也可以这样
int *p; p=array; for(int i=0;i<10;i++){ cout<<p[i]<<endl; }
还可以这样
int *p; p=array; for(int i=0;i<10;i++){ cout<<*(p+i)<<endl; }
但是指针和数组名在任何情况下都相同吗?
请看下面两段代码
int *p; p=array; for(int i=0;i<10;i++){ cout<<*p<<endl; p++; }
上边这段代码得到了正确的结果
然而下边这段代码就会出错
for(int i=0;i<10;i++){ cout<<*array<<endl; array++; }
为什么呢,因为 array 是一个指针常量,它的值是不能修改的,array一直指向系统为数组分配的内存空间的首地址;而p是一个指针变量,可以修改~~~~~
有关指针常量与常量指针的内容请参考下一篇文章~~~指针常量与常量指针