Re: [問題] 2D array的address

作者: descent (「雄辯是銀,沉默是金」)   2018-04-24 17:05:56
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後也是同樣結果
: 能請前輩們提供一下線索嗎?_?
: 謝謝
作者: zzss2003 (brotherD)   2018-04-24 17:29:00
B的型別應該是int (*)[2][3]吧?打錯了,是int [2][3]
作者: descent (「雄辯是銀,沉默是金」)   2018-04-24 17:47:00
和我舉例的 A[2] 是類似的意思
作者: LPH66 (-6.2598534e+18f)   2018-04-24 18:18:00
B + 0 應該是 &B[0], 只是在這東西也是陣列之下位址會相同
作者: KanzakiHAria (神崎・H・アリア)   2018-04-24 19:37:00
B的型別就是 int[2][3] 而不是 int*[3]enonrick的文章已經教過簡單的判別法sizeof(B) sizeof(B[0]) sizeof(B[0][0])看到連續這幾篇文章 C現在來看真的是設計不良連型別都搞錯不要亂發文害人rrrrrrrrrrrr
作者: CoNsTaR ((const *))   2018-04-25 00:14:00
不是有 right-left rule 嗎?為什麼每次都要講得好像很複雜一樣
作者: hunandy14 (Charlott.HonG)   2018-04-25 01:32:00
隱式轉換之後才變成變成指標,陣列的型態是"陣列"兩者之間比較容易是別的地方是指針不帶長度資訊標識別 ((痾怎麼還有
作者: loveflames (咕啾咕啾魔法陣)   2018-04-25 09:48:00
陣列就是陣列,不要用指標來誤導人謝謝B就是int [2][3],沒有別的了
作者: yvb   2018-04-25 13:11:00
我想原PO誤把語意當型別, 也就是 K&R C語言 5.7 多維陣列後半節, 或是 C99 C11 6.5.2.1 Array subscripting 第3點(該節Semantics第二段落) 的描述.對初學者來說, 也許講清楚語意更有助理解.
作者: freef1y3 ( )   2018-04-26 15:44:00
B應該是int [2][3]沒錯, 不過有一些吊詭的點1. 你不能寫 int C[2][3]; C = B;2. void f(int B[2][3]) {...} 那在f裡B會變成int(*)[3]

Links booklink

Contact Us: admin [ a t ] ucptt.com