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',我们仍然可以像指向数组的指针一样使用它?提前谢谢。
答案 0 :(得分:2)
因为int **
和int (*)[20]
是两种根本不同的类型。对于后者,它指向的数组的大小在编译时是固定的。
当您取消引用int **
时,您希望找到指向int*
的{{1}}指针。
当你取消引用int
时,你希望找到一个20 int (*)[20]
的块,而不是更多的指针。
分配int
时,int arr[20][20]
是一个等同于arr
的编译时符号,而不是int (*)[20]
。如果你想要后者,你必须分配一个int **
,然后将指针填充到另一个包含int * arr[20]
的内存块。
答案 1 :(得分: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是非常宽容的)。您正在传递不兼容的指针类型。即使有默认警告级别,也会发出警告。