c++ - 数组名取地址
伊谢尔伦
伊谢尔伦 2017-04-17 13:58:17
0
9
579
 int a[2];
 printf("%x  %x\n", a, &a);  // a &a 输出一样

怎么解释这种现象

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回覆(9)
洪涛

陣列名,用來存取陣列元素的時候,它就表示陣列的首位址,而當你用它來存取陣列本身的時候,它就是陣列的位址。只不過數組的首位址與數組的位址相同而已。

a 表示 &a[0]a+1 表示 &a[1]…在這個層次上,陣列名等效於可以存取陣列內部元素的指標。

&a 是對陣列這個『物件』取址,而 &a + 1 表示與陣列 a 規模相同的另一個陣列。在這個層次上,&a 等效於存取數組這個整體的指標-指向數組的指標。

阿神

C風格陣列是平鋪在堆疊上的,其構成除了陣列元素之外又沒有其它成員。所以,數組首個元素和數組位址一樣不很正常嗎?要嘛怎麼叫「首個」元素呢。

洪涛

有一個方法可能可以幫你理解
執行下面的程式碼

int a[64];
printf("%x  %x  %x  %x", a, a+1, &a, (&a)+1);

在我的機器上,運行結果是:
29fe10 29fe14 29fe10 29ff10
第一個結果和第二個結果差4,第三個結果和第四個結果差0x100
4剛好是int的長度,0x100(256)剛好是一個為長64的int數組的長度

a是這個陣列的首元素的位址,所以你才能用*(a+i)的方式存取第i個元素,而&a是這個陣列的位址,但因為一塊資料的位址是取其首字節的位址,所以他們的值相同

迷茫
    char A[20][20][20][20];
    printf("%x  %x  %x  %x  %x ", A[0][0][0] ,A[0][0],A[0], A, &A);

這五個值的也是一模一樣

阿神

如果一個變數儲存自己的位址,那麼對它取一萬次位址,也是它自己,

以上有誤。

洪涛

在C語言中,當數組名作為函數參數的時候,它會被轉換為指向數組第一個元素的指針,又因為數組第一個元素的位址就等於數組位址,所以這裡傳到printf裡的a&a參數,對應它們在函數內部的物件的是相等的,且都等與數組的位址。

阿神
  • &a是陣列的位址

  • a是陣列首元素的首位址

  • &a + 1 已經跑到陣列外面了

  • a + 1是陣列的第二個元素的位址

阿神

a和&a的值都是位址,這兩個位址是相等的。

但是a和&a的型別不一樣,具體的說:
a的型別是int *
&a的型別是int (*)[2]

這個類型會影響指標加減運算的結果,所以a+1和(&a)+1結果不等。
在這個例子中,a+1比a多4個位元組,(&a)+1比&a多8位元組

洪涛

在C中,陣列名的值是指標常數,也就是陣列第一個元素的位址
所以
&a, a, &a[0] 三者是等價的

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板