[問題] 陣列名稱所存的值與其所在的位置,兩者的值為何相同

作者: lueichun (no anonymous)   2021-06-07 21:31:43
問題(Question):
假設有一個陣列,叫做int a[5];
則a==&a==&a[0],a==&a[0]可以理解,但為何a==&a?
a的值是陣列開頭的位置(假設是1000),且a本身也佔有記憶體位置(假設是2000),
那&a不是應該是那個記憶體空間位置(2000)嗎?
所以應該是兩個不同的位置,但為何程式跑出來a==&a:
int main (int argc,char *argv[]){
int a[5];
printf("%p %p %p",a,&a[0],&a);
//結果為000000000062FE00 000000000062FE00 000000000062FE00
return 0;
}
二維陣列也是一樣的狀況,若有一陣列叫做num[3][4],則num==&num
num[0]==&num[0] num[1]==&num[1]......
我看書上都沒有解釋的很清楚,希望有人可以解惑,拜託了。
作者: LPH66 (-6.2598534e+18f)   2021-06-07 21:46:00
作者: g0010726 (Kevin)   2021-06-07 23:49:00
陣列變數有 implicit conversion 轉換成指向第一個element 的 pointer於是 a 轉換成 &a[0] 恰好這個位置跟 &a 是同個地方 都a (int[5]) implicit converted to &a[0] (int*)&a ( int (*)[5] )
作者: Lipraxde (Lipraxde)   2021-06-08 00:36:00
為什麼你會覺得 a 本身也占有一塊記憶體位置?
作者: g0010726 (Kevin)   2021-06-08 00:43:00
我猜原po可能在這裡把陣列跟pointer搞混了 一般宣告的pointer 裡面存的是指向物件的位址,但 a 裡面存的是int[5] 五個整數。主要還是前面提到的陣列implicit conversion造成對於陣列跟pointer的混淆吧
作者: sarafciel (Cattuz)   2021-06-08 03:07:00
因為你這邊的a跟num代表的不是陣列的值呀
作者: g0010726 (Kevin)   2021-06-08 11:02:00
a這個變數指的是整個陣列 (int[5]) 不是你說的陣列開頭,但因為存在implicit conversion, 所以當你在某些context下寫a會轉成 &a[0] (int *),這個才指向陣列第一個element的位址, 然後這個位置址跟整個陣列的位址&a (int(*)[5]) 相同https://imgur.com/2w7VL9S
作者: LPH66 (-6.2598534e+18f)   2021-06-08 11:24:00
「有存東西」是個大誤解, 看我這篇後續回文 #1EA_5rFL那個開頭位置不會存在記憶體哪裡, 反而是直接出現在指令上當你程式裡叫出來各種使用時編譯器會把編譯時存的對照表中那個陣列名字對應的位址放在指令中, 這就是你 printf 裡所看到的數字的來源實際上存在記憶體裡的只有陣列元素值

Links booklink

Contact Us: admin [ a t ] ucptt.com