數組名和數組名取地址的區別

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)和sizeof(&a)都是20.


ps:如果是(int)a +1,則結果是1245037(即1245036+1)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章