Re: [問題] 二維陣列的陣列名稱
※ 引述《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
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章