[問題] 二維陣列的陣列名稱
我看書上說
如果設 int a[2][3] = {1,2,3,4,5,6}
二維陣列名稱 a 被定義為此陣列的起始記憶體位址。我的解讀是:
這二維陣列的數值在記憶體上被一個連續的記憶體區塊儲存著, 其中第一個位元組的記憶
體序號就是 a, 也就是 a = &a[0][0]。
書上說, a[0] 也可以被看成 (a[0])[3], 是一個一維的陣列, 而 a[0] 是此一維陣列的
陣列名稱, 所以 a[0] 被定義是 (a[0])[3] 的第一個記憶體序號, 所以 a = &a[0][0]。
同理 a[1] 可以被看成 (a[1])[3], 是一個一維的陣列, 而 a[1] 是此一維陣列的陣列名
稱, 所以 a[1] 被定義是 (a[1])[3] 的第一個記憶體序號, 所以 a = &a[1][0]。
事實上, 程式 run 出的結果也是這樣。
main(){
int a[2][3] = {1,2,3,4,5,6};
printf("a = %p\n", a);
printf("a[0] = %p\n", a[0]);
printf("a[1] = %p\n", a[1]);
}
輸出結果:
$ ./a.exe
a = 0x22cd0c
a[0] = 0x22cd0c
a[1] = 0x22cd18
我的問題是:
*a 輸出的結果是 0x22cd0c
*(a+1) 輸出的結果是 0x22cd18
(問題一)
a 反參考後 (也就是 *a) 會得到與 a 相同的值, 這完全是因為被定義的結果嗎? 我不可
以把 a 視為是陣列 a[2] 的位址對不對 ? 原因是不是 a[0] 與 a[1] 根本不是個變數
?
(問題二)
如果我要接收 a 這個值的說, 要找一個相容的變數, 於是我設了一個指向 int [3] 的指
標 b:
int (*b)[3];
b = a;
這樣是合法 ok 的
但是, b 的反參考是 *b, 也與 b 變數的值相等, 理由是不是來自於 (問題一) 中, 被定
義的情況一樣?
自己唸書的懷惑, 請求各位的幫助, 謝謝!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.233.7.208
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章