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

看板C_and_CPP (C/C++)作者 (-858993460)時間12年前 (2011/07/24 18:18), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串4/7 (看更多)
※ 引述《Nairoda (new)》之銘言: : 多謝 L 大的回答, : 我能瞭解 : a 它是個"在 0x22cd0c 的 int[2][3]" : a[0] 它是個"在 0x22cd0c 的 int[3]" : a[0][0] 它是個"在 0x22cd0c 的 int" : 而 : : *a 會是一個"在某處的 int[3]" 而 *(a[0]) 會是一個"在某處的 int" : : 而某處在哪就是你上面提到的"值"了 : 請問上一句的 "在某處" 感覺上是個變數 (因為 L 大下一段回覆 b 中的 "某處" 是變數 : 的意思)。 : 但這裡的某處不是個變數對不對 (這是我的問題一) ? 因為在宣告 int a[2][3] 時, a : 的位置就與 a[0] 的位置是相同了(一種程式設計的定義?)。 是的 這個某處並不是紀錄在某個變數裡 以我以前回過的一篇文的講法就是「它是綁在 a 這個符號上」 因此當有和它相關的位移運算時它就會把這個某處給代進去去運算 因此最後編譯出來的程式中 這個值將會直接出現在指令上而不是存在某個變數裡 : 我想問個觀念是: : a 會等於 *a 這個現象, 我不太可以用指標變數 與 其所載的內容物的觀念去理解它是嗎 : ? 因為 a 代表著變數 a 的位置, 而 *a 是變數 a[0] 的位址 : 所以才會得到 a 與 *a 是相同的 : 第二個問題 int (*b)[3] : 讓 b = a, 所以 b 的內容物是 0x22cd0c。這裡讓 b 反參考 *b 也會得到相同的位址。 : 雖然 b 與 b* 的型別不同, 但 b 與 *b 是相同的位址也是一種上面描述的關係嗎 ? 你只能說 a 和 *a 所在的位址相同 (我相信你所謂"相同的"應是此意 但單說"相同的"非常容易讓人(包括你自己)誤解) 之所以你會陷入"看似相同的東西其實不同"的問題是因為你沒有真的去看它的型態 來個簡單一點的例子好了 我們拿掉一維 int x[2]; int *y; y = x; 你應該很清楚知道這個例子中 x x[0] *x y *y 的差別 x 是個 int 的陣列 x[0] 是其中的第一個 int *x 也會取得這第一個 int y = x 之後 y 這個指標指向上面這個陣列的開頭 所以 *y 也會取得同樣那第一個 int 再回到你的問題 int a[2][3]; int (*b)[3]; b = a; a 是個 int 的二維陣列 a[0] 是其中的第一列 *a 也會取得這第一列 b = a 之後 b 這個指標指向上面這個陣列的開頭 所以 *b 也會取得同樣那第一列 或者換個敘述方式 a 是個 int[3] 的陣列 a[0] 是其中的第一個 int[3] *a 也會取得這第一個 int[3] b = a 之後 b 這個指標指向上面這個陣列的開頭 所以 *b 也會取得同樣那一個 int[3] 這樣對比敘述你就知道你鬼打牆在哪裡了 之所以 b 和 *b 會看起來是一樣的值的原因只不過是因為 *b 是那第一列 而我們只是用這第一列的開頭位址來代表這一列而已 那因為是第一列所以正好這個開頭位址和 b 所紀錄的位置 (b 這個指標的值) 一樣而已 a 和 *a 也一樣 和 b 的差別在於 a 和 *a 都是代表某個陣列 那只是正好這兩個陣列的代表值 (它的起始處) 相同而已 因此看起來它們也好像是一樣的數字 但其實意義是不同的 --- 另外其實可以說一下 b = a; (或是我的例子中的 y = x;) 到底是什麼意思 y = x; 左邊是個指標 右邊是個陣列 這時它的意思是 "我把右邊這個陣列的起始位址設給左邊這個指標變數" 也就是其實它的意義是 y = &x[0]; 這樣 我們將這個由陣列意義轉變成指標意義的概念稱做 decay 說成 "陣列 decay 成指標" 關於這個概念可參見 C FAQ 6.3 http://c-faq.com/aryptr/aryptrequiv.html (其實你可以好好把 C FAQ 第 6 章全部看過一遍 http://c-faq.com/aryptr/index.html 看完後再回來看我這兩篇文章會對陣列和指標有更清楚的概念) -- 'Oh, Harry, don't you see?' Hermione breathed. 'If she could have done one thing to make absolutely sure that every single person in this school will read your interview, it was banning it!' ---'Harry Potter and the order of the phoenix', P513 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.28.92

07/24 18:52, , 1F
07/24 18:52, 1F

07/24 20:34, , 2F
感謝, 非常清楚
07/24 20:34, 2F
文章代碼(AID): #1EA_5rFL (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1EA_5rFL (C_and_CPP)