推 skyHuan: 哇謝謝你還專程打這麼多超詳細的,幫我釐清了很多觀念 04/03 03:14
→ adrianshum: (char*)&***c + 2 * sizeof(int[5][6]). 這段 04/03 09:21
→ adrianshum: 有點不正常。首先cast 成char* 有點怪,我不熟C99 但 04/03 09:21
→ adrianshum: 應該有int_8 或byte 之類?用這些比用char 比較能表達 04/03 09:21
→ adrianshum: 你的目的。其次應該不用 &***c 吧?直接 c 或&c 就好 04/03 09:21
→ adrianshum: 了。 04/03 09:21
推 cutekid: c[2] 記憶體位址 = c + 2 04/03 13:11
有不同運算都可以算出相同的記憶體位址, 只是最後的型別不同,
語意也不一樣:
型別 敘述
int(*)[4][5][6] &c
int(*)[5][6] c (decay 後)
int(*)[5][6] c + 2
int[5][6] c[2]
int[5][6] *c
int[6] **c
int ***c
int* &***c
***c 語意上就是取得第一個 int 元素, sizeof(char) 的值為 1,
它扮演的角色就是你說的 byte. 先將 &***c 轉成 char* 確保往後
的指標運算都是以 byte 為單位 (int8_t 只是無 padding 的連續
8 個 bits, 但無法代表一個 byte). 所以最後整串敘述的語意為:
c[2] 的位址是從第一個元素算起, 位移為 2 個
int[5][6] 大小的地方
這邊把 sizeof 放進來是想表達指標運算的背後都和元素大小相關,
而元素大小是由指標型別來決定的, 無法單純靠索引來計算位移.
推 cuteSquirrel: 推薦這篇文章 04/03 18:48
→ adrianshum: 我明白你的目的,(char*)&***c 你的目的只是用一byte 04/04 14:53
→ adrianshum: ptr 指向整個array 的起始位址而已。反正你都硬cast 04/04 14:53
→ adrianshum: 成char* 了,用&c 或 decaying c 更能表達「整個arra 04/04 14:53
→ adrianshum: y 的起始位址」的意思。 04/04 14:53
推 adrianshum: 用char方面再查考之下的確較好,我一直有個錯誤印象 1 04/04 15:01
→ adrianshum: char 未必是 1 byte 長。(怎麼標準不弄個 byte type 04/04 15:01
→ adrianshum: 出來 :( ) 04/04 15:01
重點不是最後的值如何(方法有很多種), 而是過程中轉換過的型別
敘述 原始型別 結果型別
&c int(*)[4][5][6] char*
c int[4][5][6] char*
&***c int* char*
應該不用說明也可以看出差異在哪. 與其跟新手說「請你去算出
array of array of arrays的起始位址」, 個人覺得將陣列一步步
拆解, 扁平化, 再去算位移著實簡單得多.
→ sarafciel: 他想表達的就是那個三層指標的原始型態啊 04/04 22:09
→ sarafciel: 純粹用&c或c的話會讓人以為int[4][5][6]就是拿單指標接 04/04 22:12
→ sarafciel: 新手的話更容易踩這種陷阱 04/04 22:13
嗚嗚, 握手 QQ
→ sarafciel: 是說就是因為這樣 我都不寫int[4][5][6]這種型態 04/04 22:17
→ sarafciel: 寧願弄成int[4*5*6]來做事 頂多下標麻煩一點(逃) 04/04 22:19
※ 編輯: poyenc (121.131.81.65), 04/05/2019 04:18:04