2012-11-29 154 views
1

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

+0

什么警告你好吗? – jonhopkins

+0

请做更多的研究,字面上有数以千计的SO问题/教科书/文章解释这一点。从K&R The C Programming Language开始。 – djechlin

+1

我不记得在C中有一个'Int'。除此之外,你的程序有几个语法错误。它不会编译。 – ArjunShankar

回答

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]’ 

和警告的原因是很好的解释(应该是一个错误,国际海事组织,但GCC是很宽容)。您传递的是不兼容的指针类型。即使使用默认警告级别,该警告也会发生。

2

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

当您取消引用int **时,您会发现int* - 指向int的指针。 当取消引用int (*)[20]你希望找到的20个int S,不是更多的指针块。

当您分配int arr[20][20]时,那么arr是一个编译时间符号,相当于int (*)[20],而不是int **。如果你想后,你将不得不分配int * arr[20],然后填充指针包含int [20]内存的另一个块。