Re: [問題] 二維陣列的陣列名稱

看板C_and_CPP (C/C++)作者 (-858993460)時間12年前 (2011/07/24 11:24), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串2/7 (看更多)
※ 引述《Nairoda (new)》之銘言: : 我看書上說 : 如果設 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 變數的值相等, 理由是不是來自於 (問題一) 中, 被定 : 義的情況一樣? : 自己唸書的懷惑, 請求各位的幫助, 謝謝! 像 a 這個名字除了它的位置(你講的"值")以外 它的型態也很重要 a 它是個"在 0x22cd0c 的 int[2][3]" a[0] 它是個"在 0x22cd0c 的 int[3]" a[0][0] 它是個"在 0x22cd0c 的 int" 這種型態的差別決定了 *a 和 *(a[0]) 的解釋結果不同 *a 會是一個"在某處的 int[3]" 而 *(a[0]) 會是一個"在某處的 int" 而某處在哪就是你上面提到的"值"了 也就是 *a 是 "在 0x22cd0c 的 int[3]" *(a+1) 是 "在 0x22cd18 的 int[3]" *(a[0]) 是 "在 0x22cd0c 的 int" 這個樣子 b 的情況則不一樣 它是一個 (位置在別的地方) 的指標 其內容為 0x22cd0c 那麼 *b 就只是單純對這個指標內容進行提取而已 只是提取的結果是什麼就又要再看 b 的型態了 這裡的 b 型態是 int(*)[3] 所以提取之後就是一個"在某處的 int[3]" 這邊的某處因為 b 是指標 所以所指的某處就是 b 的值 因此 *b 就是一個 "在 0x22cd0c 的 int[3]" 這樣應該可以讓你了解為何"看起來"(印出來)一樣的東西實際上會有不同解釋 -- 所以很多地方才會說"陣列不完全等於指標 只是有時你可以互相換著用"就是如此 -- 1989/02/22 優希堂悟 1990/02/22 冬川こころ 1993/07/05 小町つぐみ 1994/05/21 高江 ミュウ 1995/04 歡迎來到 星野遊々 1997/03/24 守野いづみ 1997/03/24 伊野瀬チサト 1998/06/18 守野くるみ 1999/10/19 打越鋼太郎的 楠田ゆに 2000/02/15 樋口遙 2002/ 12/17 八神ココ 2011/01/11 HAL18於朱倉岳墜機 2011/04/02 ∞與∫的世界 茜崎空啟動 2012/05/21 第貮日蝕計畫預定 2017/05/01~07 LeMU崩壞事故 2019/04/01~07 某大學合宿 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.28.92

07/24 11:33, , 1F
還要配著在等號的左邊還是右邊來使用 (LHS/RHS)
07/24 11:33, 1F

07/24 11:39, , 2F
我只是補充說明噢 (路人經過
07/24 11:39, 2F

07/24 13:17, , 3F
跟著唸一次:"陣列不等於指標"
07/24 13:17, 3F
文章代碼(AID): #1EAv1XcD (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1EAv1XcD (C_and_CPP)