我有以下代码:
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])
答案 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)
答案 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]);