2012-09-08 113 views
1

爲什麼這些函數原型不相等?array [ROWS] [COLS]和** array有什麼區別

void print_matrix(char *name, int SX, int SY, int m[SX][SY]) 

void print_matrix(char *name, int SX, int SY, int **m) 
+0

嘿,夥計們,讓我們不要挑@richard太多了 - 他很可能不做downvoting。我自己已經忘記了C對局部變量有不同的規則,就像它對參數類型所做的那樣。還有VLA的問題。你不能指望理查德去欣賞所有這些微妙之處。 –

+0

[int **和int \ [\] \ [\]之間的區別是什麼?](http://stackoverflow.com/questions/8395255/what-is-difference-between-types-int- and-int) –

+0

對不起,我剛開始以爲你對這個問題做了很多改變,你想讓它回到原來的狀態。我已經刪除了過時的評論,但您在問題中對這個問題有一個很好的答案,所以一切都已經解決了。將來,不要對完全改變其含義的問題做出戲劇性的改變,只需將其置於後面,就新的話題提出新的問題。 –

回答

6

即使兩個函數的參數可以通過m[i][j]以同樣的方式消耗,即,它們是完全不同的:

  • int m[M][N]N整數M數組的數組。

  • int **m是指向指向int的指針。

不能傳遞數組作爲函數參數,所以一個「T類型的K元件的陣列」衰減到「POIN ­叔TO- T」,指向數組的第一個元素。因此,允許和等同於在函數參數中將第一個表格寫爲int m[][N],因爲值M丟失。但是,價值N不是失去;它是這種類型的一部分!

所以以下是容許的/錯誤的爲第一種形式:

void f(int arr[M][N]); 

int a[M][N]; 
int b[2*M][N]; 
int c[M][N + 1]; 

f(a); // OK 
f(b); // OK; slowest extent is forgotten in the decay 
//f(c); // Error! 'c' is not an array of {array of N ints}. 

對於第二個形式中,意義是相當不同的:

void g(int **p); 

int a; 
int * pa = &a; 

g(&pa);   // fine, pointer to 'pa' 

int arr[M][N]; 

// g(arr); // Error, makes no sense 

表達arr指定指針到第一N整數數組的數組元素,即其類型爲int (*)[N]。解引用它給出了一個整數的指針,其中N整數,而不是

沒有方法來表達arr轉換成指針的指針:如果所述,

int ** fool = (int**)arr; 

然後*fool將指向所述第一陣列(arr[0])的第一元素,和不到int指針。因此,您無法對值進一步取消引用,因爲值不是指針

唯一正確通過二維數組作爲雙指針是構建一箇中間幫手陣列方式:

int * helper[M]; // array of pointers 

for (size_t i = 0; i != M; ++i) 
{ 
    helper[i] = arr[i]; // implicit decay 
} 

g(helper); // or "g(&helper[0])" 
+0

這是一個很好解釋的答案,謝謝 – richard

相關問題