指向数组和双指针的指针

时间:2012-11-29 17:10:36

标签: c pointers multidimensional-array

  

可能重复:
  Is 2d array a double pointer?

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',我们仍然可以像指向数组的指针一样使用它?提前谢谢。

2 个答案:

答案 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是非常宽容的)。您正在传递不兼容的指针类型。即使有默认警告级别,也会发出警告。