作者descent (「雄辯是銀,沉默是金」)
看板C_and_CPP
標題Re: [問題] 2D array的address
時間Tue Apr 24 17:05:56 2018
int B[2][3];
B 型別可以把他想成 int (*)[3]
##### 這段有點錯誤, 不要看這段
B 是一個指標, 所以 B + 0 代表一個位址 (400),
B + 1 一樣代表一個位址。
B + 0 可以寫成 B[0], 所以 B[0] 就是表示一個位址, 而不是陣列的元素 2。
#####
B[0] 等於 *(B+0) 等於 *B, 所以這 2 個是一樣的東西。
*B 就有點難解釋, int A[2], A 的型別可以想成 int*,
*B 可以想成是 int*, 是代表一個指標。
※ 引述《zzss2003 (brotherD)》之銘言:
: 圖片: https://imgur.com/a/8Q7d3GH
: 在這個影集當中,我不懂為什麼*B or B[0]是400,不是應該是2嗎?
: &B[0][0]是400我能理解,但沒辦法理解*B與B[0],影片中也沒提到為什麼
: 自己用了GCC,compile後也是同樣結果
: 能請前輩們提供一下線索嗎?_?
: 謝謝
--
若要人前顯貴, 就要人後受罪。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.218.53.138
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1524560767.A.B05.html
1F:推 zzss2003: B的型別應該是int (*)[2][3]吧? 04/24 17:29
2F:→ zzss2003: 打錯了,是int [2][3] 04/24 17:30
3F:→ descent: 和我舉例的 A[2] 是類似的意思 04/24 17:47
4F:推 LPH66: B + 0 應該是 &B[0], 只是在這東西也是陣列之下位址會相同 04/24 18:18
5F:推 KanzakiHAria: B的型別就是 int[2][3] 而不是 int*[3] 04/24 19:37
6F:推 KanzakiHAria: enonrick的文章已經教過簡單的判別法 04/24 19:39
7F:→ KanzakiHAria: sizeof(B) sizeof(B[0]) sizeof(B[0][0]) 04/24 19:40
8F:→ KanzakiHAria: 看到連續這幾篇文章 C現在來看真的是設計不良 04/24 19:44
9F:噓 KanzakiHAria: 連型別都搞錯不要亂發文害人rrrrrrrrrrrr 04/24 19:49
10F:推 CoNsTaR: 不是有 right-left rule 嗎? 04/25 00:14
11F:→ CoNsTaR: 為什麼每次都要講得好像很複雜一樣 04/25 00:14
12F:→ hunandy14: 隱式轉換之後才變成變成指標,陣列的型態是"陣列" 04/25 01:32
13F:→ hunandy14: 兩者之間比較容易是別的地方是指針不帶長度資訊 04/25 01:35
14F:→ hunandy14: 標 04/25 01:35
15F:→ hunandy14: 識別 ((痾怎麼還有 04/25 01:36
16F:噓 loveflames: 陣列就是陣列,不要用指標來誤導人謝謝 04/25 09:48
17F:→ loveflames: B就是int [2][3],沒有別的了 04/25 09:49
做了一些修改。
※ 編輯: descent (61.218.53.138), 04/25/2018 11:09:36
18F:推 yvb: 我想原PO誤把語意當型別, 也就是 K&R C語言 5.7 多維陣列 04/25 13:11
19F:→ yvb: 後半節, 或是 C99 C11 6.5.2.1 Array subscripting 第3點 04/25 13:11
20F:→ yvb: (該節Semantics第二段落) 的描述. 04/25 13:12
21F:→ yvb: 對初學者來說, 也許講清楚語意更有助理解. 04/25 13:16
22F:→ freef1y3: B應該是int [2][3]沒錯, 不過有一些吊詭的點 04/26 15:44
23F:→ freef1y3: 1. 你不能寫 int C[2][3]; C = B; 04/26 15:44
24F:→ freef1y3: 2. void f(int B[2][3]) {...} 那在f裡B會變成int(*)[3] 04/26 15:45