#include <stdio.h>
int main()
{
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)是20.
而&a為指針(指向整個數組),所以sizeof(&a)為4
ps:如果是(int)a +1,則結果是1245037(即1245036+1)