2012-04-02 187 views
5

我想通過一個數組(2d)作爲參數的函數。 我有一個代碼如下:如何將二維數組傳遞給函數在c + +

int main() 
{ 
    float T[100][100]; 
    void set_T(float T[][]); 
} 


void set_T(float T1[][]) 
{ 


    for (int i =0 ; i<90;i++) 
    { 
     for(int j =0 ;j <90;j++) 
     { 
      T1[i][j] = 3; 
     } 
    } 

} 

我不知道如何將數組傳遞給函數...我收到很多的錯誤。任何人都可以幫忙嗎?

+0

[將2D數組傳遞給函數]的可能重複(http://stackoverflow.com/questions/8767166/passing-2d-array-to-function) – legends2k 2014-03-24 12:44:56

回答

-3

就這樣稱呼它:

int main() 
{ 
    float T[100][100]; 
    set_T(T); 
} 

而作爲@suddnely_me所說,T1在函數聲明的類型必須是float**

+2

'float [] []'和'float **'是不同的。 – 2012-04-02 00:43:43

+0

@Jesse是對的。一個C風格的二維數組並不是作爲數組*指針的數組來實現的。它是一個數組數組,即第一行100個元素,後面跟着第二行100個元素等。因此,要使用C語法正確訪問二維數組,所調用的函數只需指定一個維度即可。 – 2012-04-02 00:44:38

5
void set_T(float (&T)[100][100]); 
8

這裏有兩個問題:

  • C不支持二維數組,只有數組的數組或指針數組到數組,這兩者都不是完全一樣的東西作爲一個二維數組
  • C不允許傳遞數組作爲參數,只有指向數組的指針(通常,您使用指向數組第0個元素的指針,因爲這就是數組名的最終結果,因此這樣的指針索引看起來就像陣列訪問)

因此,由於第一個問題,您必須決定如何表示二維數組 - 要麼是數組數組,要麼是指向數組的指針數組。如果你走第一條路,你的代碼最終看起來像:

void set_T(float (*T1)[100]) { 
    ... do stuff with T1[i][j] ... 
} 

int main() { 
    float T[100][100]; 
    set_T(T); 
} 

在這裏,你已經聲明噸至100個陣列100輛彩車的數組,並set_T採用指向100輛彩車的數組作爲它的論點。您將'T'直接傳遞給set_T,因爲該語言將數組名稱視爲指向其第0個元素的指針。

相反,如果你想使用指針數組到數組,你最終的東西,如:

void set_T(float **T1) { 
    ... do stuff with T1[i][j] ... 
} 

int main() { 
    float *T[100]; 
    float space[100*100]; 
    for (int i = 0; i < 100; i++) 
     T[i] = space + i*100; 
    set_T(T); 
} 

這裏的缺點是,你需要爲所有的第二級陣列的分配空間和手動初始化所​​有第一級指針指向它們。 advangtage是第二級數組的大小不是傳遞給set_T的參數類型的一部分,因此您可以更輕鬆地處理可變大小的數組。當然,如果你真的使用C++而不是C,那麼你根本不應該使用C數組 - 你應該使用std::vectorstd::array而不是 - 它們都共享C數組1D唯一的問題,所以你需要一個矢量向量或一個數組陣列(或者可以想象一個向量陣列或向量陣列)

+0

我覺得你的回答可能會列出一些更好的替代方法來使'float(*)[100]'或'float **'真正完成。 – 2012-04-02 00:51:16