Re: [問題] 三維陣列

看板C_and_CPP (C/C++)作者 (超‧廢柴大叔)時間15年前 (2009/02/19 21:30), 編輯推噓1(101)
留言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
你傳array給func的話 就和傳pointer "一樣" 了
02/19 21:36, 1F

02/19 22:04, , 2F
受教了
02/19 22:04, 2F
文章代碼(AID): #19dLyF6Z (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
5
10
完整討論串 (本文為第 2 之 2 篇):
5
10
文章代碼(AID): #19dLyF6Z (C_and_CPP)