【问题标题】:Hard time passing two dimensional arrays to functions很难将二维数组传递给函数
【发布时间】:2013-01-10 01:34:43
【问题描述】:

所以我正在处理这段代码,其中我试图将二维数组传递给函数,如下所示:

函数签名:void f(array[4][4],int n);

int array [4][4];
f(&array[0][0],16)
for (int i=0;i<n;i++) // I'm working by c99 standard.
{
 hist[ *(&array[0][0] +i) ] ++ ;  // I know the max value in array[4][4] , and hist is initialized accordingly.
}
}

我只是不断收到关于不兼容类型的各种错误,例如,我得到“预期 (*)[4] 但类型是 int * 帮助 ? :)

【问题讨论】:

  • 如果你只做f(array,16)会发生什么?

标签: c


【解决方案1】:

&amp;array[0][0] 是一个 int 指针。

指针不能转换为二维数组。因此,您需要像f(array, 16) 一样传递它。基本上,您传递的是 int*,而这与 int[][4] 不兼容。

值得指出的是,这对于一维数组是有效的(尽管它是不必要的并且可能会造成混淆):

void g(int x[]) {}
int arr[4];
g(arr); //valid of course
g(&arr[0]); //also valid

This 解释了为什么它与多维数组不同。

【讨论】:

  • 这个语法有效吗? f (array,n) { for (int i=0;i&lt;n;i++) // assuming that array is nxn. { for(int j=o;j&lt;n;j++) { *(*(array+i)+j) = somthing; // am I accessing the element in the i'th line , j'th column ?
  • @user1965208 f (array,n) 是无效的函数签名。此外,如果数组是二维数组,您应该只使用array[i][j]*(*(array+i)+j) 确实是正确的——至少在语法上是正确的。
  • 实际上我已经在第一条评论中声明了函数的签名,其次,事后我意识到你是对的,使用括号可能更容易,但这个错误让我受益因为在过去一个小时左右的时间里,我学到了很多关于多维数组的知识。不管怎样,谢谢你的回复:)
猜你喜欢
  • 2020-11-01
相关资源
最近更新 更多