1

可能重复:
二维数组是双指针吗?

void fun(int **ptr,int n)
{
int i=0;j=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
 printf("%d  ",a[i][j]);

}

Int main()
{
int arr[20][20];
int **ptr=arr;  //Statement 1
fun(arr,20);
}

为什么语句 1 给出警告而函数调用没有?我看到这是函数调用中的一个例外情况。这背后有什么原因吗?指向数组的指针“arr”如何变成双指针“ptr”,而我们仍然可以像使用指向数组的指针一样使用它?提前致谢。

4

2 回答 2

2

因为int **int (*)[20]是两种根本不同的类型。对于后者,它指向的数组的大小在编译时是固定的。

当您取消引用 an 时,int **您希望找到一个int*指向int. 当您取消引用 a 时,int (*)[20]您希望找到一个 20int秒的块,而不是更多的指针。

当你分配int arr[20][20]thenarr是一个编译时符号,相当于int (*)[20], not int **。如果您想要后者,则必须分配 aint * arr[20]然后填充指向另一个包含int [20].

于 2012-11-29T17:54:58.273 回答
0

为什么语句 1 给出警告而函数调用没有?

在修复代码以便编译之后,它确实如此:

danger.c: In function ‘main’:
danger.c:15:11: warning: initialization from incompatible pointer type [enabled by default]
danger.c:16:1: warning: passing argument 1 of ‘fun’ from incompatible pointer type [enabled by default]
danger.c:3:6: note: expected ‘int **’ but argument is of type ‘int (*)[20]’

并且警告的原因得到了很好的解释(应该是一个错误,IMO,但 gcc 是非常宽容的)。您正在传递不兼容的指针类型。即使默认警告级别也会出现该警告。

于 2012-11-29T17:16:21.303 回答