1、對於上次數組有關sizeof的解析如下:
//一維數組
int a[] = { 1, 2, 3, 4 };
printf("%d\n", sizeof(a)); // 這裏 a代表數組首元素地址,sizeof(a)求得是整個數組 的長度:16
printf("%d\n", sizeof(a + 0));// a+0代表指向數組第一個元素的指針,即&a[0]:4
printf("%d\n", sizeof(*a));// *a代表解引用首元素地址的元素,即a[0]:4
printf("%d\n", sizeof(a + 1));// a+1代表指向數組第二個元素的指針,即&a[1]:4
printf("%d\n", sizeof(a[1]));// a[1]代表數組第二個元素:4
printf("%d\n", sizeof(&a)); // &a代表取整個數組的地址,其值和a相同,即&a[0]:4
printf("%d\n", sizeof(&a + 1));//&a+1代表指向整個數組下一個位置的指針,指向了元素4 後面的那個地址,仍是一個指針:4
printf("%d\n", sizeof(&a[0]));//&a[0]代表取第一個元素的地址,同&a:4
printf("%d\n", sizeof(&a[0] + 1));// &a[0]+1代表指向第二個元素的指針,即指向a[1]的 指針:4
//二維數組
int a[3][4] = { 0 };
printf("%d\n", sizeof(a)); // 同上,求的是整個數組的長度:48
printf("%d\n", sizeof(a[0][0]));//a[0][0]代表第一個元素:
printf("%d\n", sizeof(a[0]));// a[0]代表第一維,是一個數組名,而它的元素是四個整 形,所以a[0]同一維數組中的數組名一樣:16
printf("%d\n", sizeof(a[0] + 1));//a[0]+1代表指向a[0][1]的指針,即&a[0][1]:4
printf("%d\n", sizeof(a + 1));// a+1,a是指向數組首元素(這裏是第一維,將a看成一個一 維數組)的地址,所以a+1就指向了第二個數組元素(即第二維),是一個指針:4
printf("%d\n", sizeof(&a[0] + 1));// 同上,因爲&a[0]即是a:4
printf("%d\n", sizeof(*a));// *a代表*(a+0),即a[0]:16
printf("%d\n", sizeof(a[3]));// a[3]即 *(a+3),是個數組名,同上,只不過在這裏, 越界,指向了第四行:16
2、總結如下:
理解數組方法如:先用一維數組說明,
《1》數組名:永遠表示指向數組首元素的地址;
例1:int a[10];
a代表指向數組首元素的地址,唯有在兩個地方不同,(1)sizeof(a)代表求整個數組的長度;(2)&a 代表數組的地址,即是一個指向數組的指針,除此之外都代表數組首元素的地址。
《2》下標的運算
例2:a+1 代表的是指向第二個元素的指針,因爲a是首元素地址,以此爲長度基準增加1,即指向了第 二個元素
注:下標運算增減的長度都是根據前一個變量所表示的量爲基準增減量。
《3》多維數組
多維數組所有的規則同一維數組一樣,只是將多維數組看成了一維數組,其中的元素又是數組而已。
例3:int a[3][4];
可以將其看成一個一維數組,有三個元素a[0],a[1],a[2],不同的是這三個元素的值又是數組,每個數組有四個int元素,所以,a[0],a[1],a[2]又可以看成是三個數組名了
綜上,根據以上規則,即可理解上面代碼中的各種變換,數組的深入理解很重要。