2012-11-29 155 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]內存的另一個塊。