PCDVD數位科技討論區

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)

joe3970 2018-05-31 04:34 PM

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]
答案會不同?
謝謝

yaingc 2018-05-31 04:57 PM

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:

joe3970 2018-05-31 05:24 PM

可是沒給值
理頭的值應該是亂七八糟的吧.


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]
老天啊.
到底是我錯在哪裡呢?

yaingc 2018-05-31 06:01 PM

我之前的回應有問題,在此更正一下

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/

joe3970 2018-05-31 06:14 PM

嗯,這個有趣
目前還不了解您的意思
讓我先消化消化您給的網頁資料
有問題再跟您請教
感恩yaingc

stanleywang 2018-05-31 06:32 PM

其實也沒有很難理解,
兩次減法的答案其實是相同的,
只是單位不同
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,
剛好就是兩個答案相除。

joe3970 2018-05-31 09:13 PM

感謝兩位前輩的指導
原來如此 :D
已經瞭解了
感恩感恩

youporn 2018-05-31 10:24 PM

蠻有趣的,用線上 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

joe3970 2018-05-31 11:15 PM

是啊
有趣
不過也讓我認知到原來我陣列的基本觀念這麼糟糕!: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所提的解法樓上的已經寫得很詳細了
感恩各位先進們

andy740629 2018-06-01 04:14 AM

"實務上"也頂多用到雙重陣列和雙重指標,寫了一些只有"自己"看得懂的程式碼是不允許的
:ase

小弟對於你的精益求精的態度給你一個讚
:like:


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

vBulletin Version 3.0.1
powered_by_vbulletin 2024。