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

int main()
{
   int a[3]={1,2,3};
   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("%d\n",(int)a+1);
    return 0;
}


分析:
    由運行結果可知,數組名a和&a得內存地址相同。我們由數組和指針的關係知道,a代表這個數字,它相當於一個指針,指向第一個元素(&a[0]),即指向數組的首地址。數組中的其他元素可以通過a的位移得到,此時的進階是以數組中單個的元素類型爲單位的。所以有a+1爲2686648,即數組中a[1]的地址是2686648(在首地址2686644基礎上加int的字節數4得到的)。
    然而,&a代表的不是取a這個變量的地址,而是取數組元素的地址。雖然&a和a得內存地址相同,但它們的意義不相同,它是代表整個數組的,它的進階單位是整個數組的字節長度(這裏是4*3=12),所以&a+1得內存地址爲2686656。

   其實,a的類型是int[3]   數組
         &a的類型是int(*)[3]  指針——指向int[3]數組的指針,所以+1相當於加上3個int型的長度
         &a[0]的類型是int*    指針——指向int類型的指針,所以+1相當於加上1個int的長度
 (int)a+1             將ad地址轉換成int型,+1,就是整型數+1

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