我正在使用一个函数,该函数以 2D 数组作为参数调用递归函数,但出现此错误:
In function 'void Rivers(int (*)[1000], int, int)':
cannot convert 'int (**)[1000]' to 'int* (*)[1000]' for argument '1' to 'void Horizontal(int* (*)[1000], int, int, int, int, int*)'
这是函数:
void Rivers (int m[1000][1000],int n,int m1)
{
int i,j,z=1,cpt;
for(i=0;i<n;i++)
{
for (j=0;j<m1;j++)
{
Horizontal(&m,i,n,m1,j,&cpt);
printf("river number %d is %d blocks in size\n",z,cpt);
z++;
}
}
}
这是递归无效:
void Horizontal(int*m[1000][1000],int i,int n,int m1,int j,int*cpt)
{
if(i<n && j<m1)
{
if(*m[i][j]!=0)
{
*m[i][j]=0;
*cpt++;
Vertical(&*m,i,n,m1,j,&*cpt);
Horizontal(&*m,i,n,m1,j-1,&*cpt);
Horizontal(&*m,i,n,m1,j+1,&*cpt);
}
}
}
最佳答案
指向数组的指针不是指针数组。
Rivers 中 m
的类型(大致)是 int[1000][1000]
,一个由 1000 个数组组成的数组,每个数组包含 1000 个 int
s。
当您采用&m
时,类型(大致)是int[1000][1000]*
,指向由1000个int组成的1000个数组组成的数组的指针
s。
在Horizontal
中,m
的类型是int*[1000][1000]
,一个由1000个数组组成的数组,每个数组有1000个 int* 。完全不同的类型。
解决方案
不必费心使用指针,因为行为不会有任何不同。
由于调用函数时不会复制数组,因此对 Horizontal
中的 m
所做的任何更改都会影响 Rivers
中的 m
code> 而不将其设为指针。
void Horizontal(int m[1000][1000],int i,int n,int m1,int j,int*cpt);
<小时/>
注意:使用 typedef
命名 int[1000][1000]
不起作用。由于二维数组不保存在 C 类型系统中,编译器将在函数调用时抛出 cannot conversion 'int (**)[1000]' to 'int (*)[1000][1000] 的函数调用'
即使它们理论上是相同的类型。
关于在以二维数组作为参数的函数中调用递归 void 会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59522182/