爲什麼這些函數原型不相等?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)
爲什麼這些函數原型不相等?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)
即使兩個函數的參數可以通過在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])"
這是一個很好解釋的答案,謝謝 – richard
嘿,夥計們,讓我們不要挑@richard太多了 - 他很可能不做downvoting。我自己已經忘記了C對局部變量有不同的規則,就像它對參數類型所做的那樣。還有VLA的問題。你不能指望理查德去欣賞所有這些微妙之處。 –
[int **和int \ [\] \ [\]之間的區別是什麼?](http://stackoverflow.com/questions/8395255/what-is-difference-between-types-int- and-int) –
對不起,我剛開始以爲你對這個問題做了很多改變,你想讓它回到原來的狀態。我已經刪除了過時的評論,但您在問題中對這個問題有一個很好的答案,所以一切都已經解決了。將來,不要對完全改變其含義的問題做出戲劇性的改變,只需將其置於後面,就新的話題提出新的問題。 –