2012-04-02 120 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