{
int a[5];
printf("%d\n", a);
printf("%d\n", &a);
printf("%d\n", a + 1);
printf("%d\n", &a + 1);
printf("%d\n", &a[0] + 1);
printf("---------------\n");
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(&a));
return 0;
}
運行結果:
分析:
由運行結果可知,數組名a和&a得內存地址相同。我們由數組和指針的關係知道,a代表這個數字,它相當於一個指針,指向第一個元素(&a[0]),即指向數組的首地址。數組中的其他元素可以通過a的位移得到,此時的進階是以數組中單個的元素類型爲單位的。所以有a+1爲1245040,即數組中a[1]的地址是1245040(在首地址1245036基礎上加int的字節數4得到的)。
然而,&a代表的不是取a這個變量的地址,而是取數組元素的地址。雖然&a和a得內存地址相同,但它們的意義不相同,它是代表整個數組的,它的進階單位是整個數組的字節長度(這裏是4*5=20),所以&a+1得內存地址爲1245056。
其實,a的類型是int[5] 數組
&a的類型是int(*)[5] 指針——指向int[5]數組的指針
&a[0]的類型是int* 指針——指向int類型的指針
另外,當用sizeof時,由於它是個關鍵詞,而不是個函數,所以數組不自動轉換爲指針,得到的結果是數組的長度*數組中元素類型所佔的字節數,本例中sizeof(a)和sizeof(&a)都是20.
ps:如果是(int)a +1,則結果是1245037(即1245036+1)