我有以下代码:
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])
函数签名应该是这样的:
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!
将 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]);