如何在C++中将二维数组传递给函数

5

我正在尝试将一个二维数组作为参数传递给一个函数。

以下是我的代码:

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;
      }
  }

}

我不确定如何将数组传递给函数...我遇到了很多错误。请问有人可以帮忙吗?


可能是重复的问题:将二维数组传递给函数 - legends2k
3个回答

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);
}

在这里,你声明了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);
}

这里的缺点是你需要为所有二级数组分配空间并手动初始化所有一级指针以指向它们。其中的优点是,第二级数组大小不是传递给set_T的参数类型的一部分,因此你可以更轻松地处理可变大小的数组。
当然,如果你真的在使用C++而不是C,你应该完全不使用C数组 -- 而是应该使用std::vector或std::array -- 它们都共享C数组1D问题,因此你需要一个向量的向量或一个数组的数组(或一个向量的数组或一个数组的向量)。

我觉得你的回答可以列出一些更好的替代方案,以使其真正完整,而不是只有float (*)[100]float ** - Luc Danton

6
  void set_T(float (&T)[100][100]);

-4

就像这样调用它:

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

正如 @suddnely_me 所说,函数声明中的 T1 类型需要是 float**


2
float[][]float** 是不同的。 - Jesse Good
@Jesse是正确的。C风格的二维数组并不是实现为指向数组的指针数组。它是一个数组的数组,即100个元素的第一行,后面是100个元素的第二行,依此类推。因此,要使用C语法正确访问2D数组,被调用的函数需要指定除一个维度之外的所有维度。 - John Calsbeek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接