Re: [問題] 三維陣列
看板C_and_CPP (C/C++)作者cerberus1226 (超‧廢柴大叔)時間15年前 (2009/02/19 21:30)推噓1(1推 0噓 1→)留言2則, 2人參與討論串2/2 (看更多)
※ 引述《Hermite (Simple Life)》之銘言:
: 我有個三維陣列 red[600][320][240]
: 然後要將這個陣列傳給副程式int fun();
: 我寫成
: fun(red);
: int fun( int *** red)
: 可是學長說我這樣寫不對,得要在陣列前加上&
: int fun(int *** &red)
: 但是跑出來的結果都是相同的,是巧合嗎?
: 我想問這種寫法兩個有什麼差別呢?
int fun( int red )
int fun( int &red )
這兩個跑出來的內容完全一樣絕對不是巧合
int a = 1;
int b = a;
int &c = a;
這兩行的差別在於,c是a的參考,而b只是複製a的值而已
即b = 2; c = 3; 後
a 的值為3
同理可知
int red1 = p;
int *** &red2 = p;
這兩行不管你取的 i, j, k 值為何
red1[i][j][k] 必等於 red2[i][j][k]
因為他們取到的是同一塊記憶體位址的內容
red1 指向的位址同 p
red2 即 p
=> red1 指向的位址同 red2
這二者的差別有兩點
一、會不會影響到原本的值
二、傳遞的方法(一個為值的複製、一個是參考的傳遞)
所以如果當Type的複製很耗時的時候,兩者會在效率上有較大的差別
當然,此情況下後者效率較佳
至於說要 int fun( int red[600][320][240] ) 才會過
其實應該是 int fun( int red[][320][240] ) 就會過了
參數值放陣列的方法是 Type array[];
int red[][320][240] 其實就是 (int[320][240]) red[] 的意思
至於如果因為檢查型態過不了的話,你大可以強制轉型
如 (int ***)a 之類的,但如果轉錯型的話程式也不能用就是了
編譯會過和結果會對本來就是兩回事
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.46.192.118
→
02/19 21:36, , 1F
02/19 21:36, 1F
推
02/19 22:04, , 2F
02/19 22:04, 2F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章