C ++指针数组参数

时间:2012-04-24 11:50:00

标签: c++ arrays pointers arguments

我有以下代码:

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

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

这会抛出以下错误消息:

  

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

3 个答案:

答案 0 :(得分: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!

答案 1 :(得分:0)

int (*x)[200][3]int *x[200][3]

之间存在差异

答案 2 :(得分: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]);