Regular Member
加入日期: Jan 2017
文章: 85
|
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] 答案會不同? 謝謝 |
|||||||
2018-05-31, 04:34 PM
#1
|
Regular Member
加入日期: Mar 2006
文章: 73
|
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]); 多了&號先取記憶體位置再運算 二個運算不同,結果不會一樣吧 |
||
2018-05-31, 04:57 PM
#2
|
Regular Member
加入日期: Jan 2017
文章: 85
|
可是沒給值
理頭的值應該是亂七八糟的吧. 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] 老天啊. 到底是我錯在哪裡呢? 此文章於 2018-05-31 05:26 PM 被 joe3970 編輯. |
2018-05-31, 05:24 PM
#3
|
Regular Member
加入日期: Mar 2006
文章: 73
|
我之前的回應有問題,在此更正一下
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/ 此文章於 2018-05-31 06:11 PM 被 yaingc 編輯. |
2018-05-31, 06:01 PM
#4
|
Regular Member
加入日期: Jan 2017
文章: 85
|
嗯,這個有趣
目前還不了解您的意思 讓我先消化消化您給的網頁資料 有問題再跟您請教 感恩yaingc |
2018-05-31, 06:14 PM
#5
|
Amateur Member
加入日期: Oct 2017
文章: 38
|
其實也沒有很難理解,
兩次減法的答案其實是相同的, 只是單位不同 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, 剛好就是兩個答案相除。 |
2018-05-31, 06:32 PM
#6
|
Regular Member
加入日期: Jan 2017
文章: 85
|
感謝兩位前輩的指導
原來如此 已經瞭解了 感恩感恩 |
2018-05-31, 09:13 PM
#7
|
Major Member
加入日期: Mar 2012
文章: 195
|
蠻有趣的,用線上 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 |
2018-05-31, 10:24 PM
#8
|
Regular Member
加入日期: Jan 2017
文章: 85
|
是啊
有趣 不過也讓我認知到原來我陣列的基本觀念這麼糟糕! 我提出另一個解法 這是我看了yaingc前輩所提供的網址所聯想到的 a[5][5] - a[0][0] = (5x6x6)+(5x6)=210 &a[5][5][0][0] - &a[0][0][0][0] =(5x6x6x6)+(5x6x6)=1260 而stanleywang所提的解法樓上的已經寫得很詳細了 感恩各位先進們 |
2018-05-31, 11:15 PM
#9
|
Senior Member
加入日期: Jan 2005
文章: 1,248
|
"實務上"也頂多用到雙重陣列和雙重指標,寫了一些只有"自己"看得懂的程式碼是不允許的
小弟對於你的精益求精的態度給你一個讚
__________________
l******* 帳號就是會亂嗆、攻擊、引戰、對號入座、腦羞成怒的瘋狗,已多人中槍請大家小心 !!! 分身帳號 : k*******a 嘴臭一言堂 , 持續更新中 ing https://pcdvd.com.tw/showthread.php?t=986965&page=3&pp=10 https://pcdvd.com.tw/showthread.php?t=1191622&page=3 https://www.pcdvd.com.tw/showthread.php?t=1199571&page=2 瘋狗一言堂 , 持續更新中 ing https://www.pcdvd.com.tw/showthread.php?t=1045414&page=1087&pp=10 https://www.pcdvd.com.tw/showthread.php?t=1199365&page=5&pp=10 嘴臭哥分身進化史 https://www.pcdvd.com.tw/showthread.php?t=1199365&page=6&pp=10 https://www.pcdvd.com.tw/showthread.php?t=1197251&page=5 |
2018-06-01, 04:14 AM
#10
|