数组名:常量指针
我们已经学习过数组的定义,并且已经知道,数组名所代表的值就是数组的首地址,一旦定义了数组之后,数组名所代表的值就不能再改变。从指针的角度来看,数组名就是一个常量指针,比如:
int a[10];
那么a就是一个常量指针,即:int *const a。因此,不能再用其它的值赋值给a。因为a是常量。
此外,数组名虽然代表了数组的首地址虽然a与&a值一样,都是数组的首地址,但是,a与&a的含义并不一样。对于一维数组来说:
int a[10];
&a+1中的1代表的是整个数组的长度10*sizeof(int);
a+1中的1代表的是一个元素的长度sizeof(int)。
&a[0]+1中的1也代表的是一个元素的长度。
对于多维数组来说:
int a[5][10];
a和&a都是数组a[5][10]的首地址。那么它们有什么不同呢?实际上,它们代表的类型不同。a是int
a[10]的类型,而&a则是a[5][10]的类型。大家知道,指针运算中的“
a + 1 = 1310392 + sizeof (int) * 10 = 1310392 + 4 * 10 = 1310432
&a + 1 = 1310392 + sizeof (int) * 10 * 5 = 1310392 + 4 * 10 * 5 = 1310592
更抽象点的说,如果定义一个多维数组int a[M1][M2][…][Mn],那么a + 1 = a首地址+M2*M3*…*Mn *sizeof (int);而&a + 1 = a首地址 + M1*M2*…*Mn*sizeof (int)。
&a[0][0]:就是数组第一个元素的地址,它的内存字节是4个字节。因此&a[0][0]+1,此处的1代表的长度是4个字节。