PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 疑難雜症區
帳戶
密碼
 

回應
 
主題工具
joe3970
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
回應時引用此文章
joe3970離線中  
yaingc
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
回應時引用此文章
yaingc離線中  
joe3970
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
回應時引用此文章
joe3970離線中  
yaingc
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
回應時引用此文章
yaingc離線中  
joe3970
Regular Member
 

加入日期: Jan 2017
文章: 85
嗯,這個有趣
目前還不了解您的意思
讓我先消化消化您給的網頁資料
有問題再跟您請教
感恩yaingc
舊 2018-05-31, 06:14 PM #5
回應時引用此文章
joe3970離線中  
stanleywang
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
回應時引用此文章
stanleywang離線中  
joe3970
Regular Member
 

加入日期: Jan 2017
文章: 85
感謝兩位前輩的指導
原來如此
已經瞭解了
感恩感恩
舊 2018-05-31, 09:13 PM #7
回應時引用此文章
joe3970離線中  
youporn
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
回應時引用此文章
youporn離線中  
joe3970
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
回應時引用此文章
joe3970離線中  
andy740629
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
回應時引用此文章
andy740629離線中  


回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



所有的時間均為GMT +8。 現在的時間是12:38 PM.


vBulletin Version 3.0.1
powered_by_vbulletin 2024。