PCDVD數位科技討論區
(https://www.pcdvd.com.tw/index.php)
- 疑難雜症區
(https://www.pcdvd.com.tw/forumdisplay.php?f=34)
- - C語言陣列的問題?
(https://www.pcdvd.com.tw/showthread.php?t=1147389)
|
---|
C語言陣列的問題?
#include <iostream>
int main() { int a[6][6][6][6]; printf("a5][5]=%d\na[0][0]=%d\n%d\n",a[5][5],a[0][0],a[5][5]-a[0][0]); printf("a[5][5][0][0]=%d\na[0][0][0][0]=%d\n%d",&a[5][5][0][0],&a[0][0][0][0],&a[5][5][0][0]-&a[0][0][0][0]); } 執行結果 a[5][5]=1338320 a[0][0]=1333280 210 a[5][5][0][0]=1338320 a[0][0][0][0]=1333280 1260 要請問的是a[5][5]和a[5][5][0][0]的記憶體位址都相同 為何 a[5][5]-a[0][0] 和 a[5][5][0][0]-a[0][0][0][0] 答案會不同? 謝謝 |
printf("a5][5]=%d\na[0][0]=%d\n%d\n",a[5][5],a[0][0],a[5][5]-a[0][0]);
直接取值去運算 printf("a[5][5][0][0]=%d\na[0][0][0][0]=%d\n%d",&a[5][5][0][0],&a[0][0][0][0],&a[5][5][0][0]-&a[0][0][0][0]); 多了&號先取記憶體位置再運算 二個運算不同,結果不會一樣吧 :confused: |
可是沒給值
理頭的值應該是亂七八糟的吧. printf("a5][5]=%d\na[0][0]=%d\n%d\n",a[5][5],a[0][0],a[5][5]-a[0][0]); 我的程式這邊少一個[ printf("a[5][5]=%d\na[0][0]=%d\n%d\n",a[5][5],a[0][0],a[5][5]-a[0][0]); a[5][5][0][0]才是取值不是嗎? 我的觀念是 a[5][5]是取a[5][5][0][0]的址 所以我才認為a[5][5]==&a[5][5][0][0] 老天啊. 到底是我錯在哪裡呢? |
我之前的回應有問題,在此更正一下
a[5][5] 和 &a[0][0][0][0] 本身都是記憶體位置沒有錯 雖然a[5][5]是指向a[0][0][0][0]本身的位置,但它本身 也是「6位元組資料型態指標」。 所以a[5][5]-a[0][0]相減的結果為二位址距離「多少個6位元組資料型態記憶體位置」 再來, &a[5][5][0][0]和&a[0][0][0][0]本身也都是記憶體位置, 但都是「byte型態」記憶體指標。 &a[5][5][0][0]和&a[0][0][0][0]二個相減的結果就是 二個位置「多少個byte記憶體位置」 所以: printf("a5][5]=%d\na[0][0]=%d\n%d\n",a[5][5],a[0][0],a[5][5]-a[0][0]); printf("a[5][5][0][0]=%d\na[0][0][0][0]=%d\n%d",&a[5][5][0][0],&a[0][0][0][0],&a[5][5][0][0]-&a[0][0][0][0]); 這二行的結果不會一樣。 指標之間的相減,要看指標本身指向的記憶體內容型態而定。 可以參考一下這網頁 http://ivan7645.github.io/2017/01/11/ptr_multi_arr/ |
嗯,這個有趣
目前還不了解您的意思 讓我先消化消化您給的網頁資料 有問題再跟您請教 感恩yaingc |
其實也沒有很難理解,
兩次減法的答案其實是相同的, 只是單位不同 a[5][5][0][0]-a[0][0][0][0] 答案的單位是int的寬度,實際是多寬要看你用的compiler, a[5][5]-a[0][0] 答案的單位是[][]int的寬度,就是2個指標再加1個int的寬度。 看起來你這個compiler的陣列指標的寬度是3byte,兩個是6byte, 剛好就是兩個答案相除。 |
感謝兩位前輩的指導
原來如此 :D 已經瞭解了 感恩感恩 |
蠻有趣的,用線上 C compier 跑了一下才發現原來:
a[0][0] 的型態是 int (*)[6] 長度是 4*6 = 24 &a[0][0][0][0] 的型態是 int * 長度是 4 所以 a[5][5] - a[0][0] = (1338320 - 1333280) / 24 = 210 &a[5][5][0][0] - &a[0][0][0][0] = (1338320 - 1333280) / 4 = 1260 |
是啊
有趣 不過也讓我認知到原來我陣列的基本觀念這麼糟糕!:rolleyes: 我提出另一個解法 這是我看了yaingc前輩所提供的網址所聯想到的 a[5][5] - a[0][0] = (5x6x6)+(5x6)=210 &a[5][5][0][0] - &a[0][0][0][0] =(5x6x6x6)+(5x6x6)=1260 而stanleywang所提的解法樓上的已經寫得很詳細了 感恩各位先進們 |
"實務上"也頂多用到雙重陣列和雙重指標,寫了一些只有"自己"看得懂的程式碼是不允許的
:ase 小弟對於你的精益求精的態度給你一個讚 :like: |
所有的時間均為GMT +8。 現在的時間是10:02 PM. |
vBulletin Version 3.0.1
powered_by_vbulletin 2024。