2

我有以下代码:

void getPossibilities(int *rating[200][3]){
// do something
}

int main ()
{
int rating[200][3];
getPossibilities(&rating);
}

这会引发以下错误消息:

错误:无法将参数 1 的 int ( )[200][3] 转换为 int ( )[3] 到 void getPossibilities(int (*)[3])

4

3 回答 3

5

函数签名应该是这样的:

void getPossibilities(int (*rating)[3]);

并将参数传递为:

getPossibilities(rating);

变量rating是一个二维数组形式T[M][N],它可以衰减为形式的类型T(*)[N]。所以我认为这就是你想要的。

正如在上面的解决方案中,数组衰减,失去一维的大小(在你只知道N可靠的函数中,你只是M由于数组衰减而丢失),所以你必须改变函数的签名以避免衰减数组:

void getPossibilities(int (&rating)[200][3]) //note : &, 200, 3
{
  //your code
}

//pass argument as before
getPossibilities(rating);  //same as above

更好的是使用模板作为:

 template<size_t M, size_t N>
 void getPossibilities(int (&rating)[M][N])
 {
       //you can use M and N here
       //for example
       for(size_t i = 0 ; i < M ; ++i)
       {
          for(size_t j = 0 ; j < N ; ++j)
          {
             //use rating[i][j]
          }    
       }
 }

要使用这个函数,你必须像以前一样传递参数:

 getPossibilities(rating); //same as before!
于 2012-04-24T11:52:03.580 回答
0

int (*x)[200][3]和之间有区别int *x[200][3]

于 2012-04-24T11:54:14.020 回答
0

将 N 维数组传递给函数时,总是忽略第 0 维。这就是为什么a[N]衰减到*p。同理,a[N][M]衰减为(*p)[M]
这里,是一个指向元素(*p)[M]数组的指针。M

int a1[N][M], a2[M];
int (*p)[M];
p = a1; // array a1[N][M] decays to a pointer
p = &a2; // p is a pointer to int[M]

所以你的函数签名应该是:

void getPossibilities(int (*rating)[3]);

现在,由于您使用的是 C++,因此值得利用它的功能,您可以通过引用传递数组。所以首选的方式是:

void getPossibilities(int (&rating)[200][3]);
于 2012-04-24T12:05:22.577 回答