大警告:我通常不會這樣處理多維數組。
我想這只是爲了檢查,但這:
#include <stdio.h>
int foo(char b[][7])
{
printf("%d\n", b[3][4]);
return 0;
}
int main(int argc, char** argv)
{
char multi_d_arr[20][7];
multi_d_arr[3][4] = 42;
foo(multi_d_arr);
return 0;
}
編譯並運行不受任何問題,請使用gcc -Wall
。老實說,我不確定第二個參數如何被認爲是不兼容的指針類型。工作正常。
但是,既然你問了,我將如何處理二維數組?更好的方法是使用指針,像這樣:
char** array2d = malloc((MAX_i+1)*sizeof(char*));
for (i = 0; i < (MAX_i+1); i++)
{
array2d[i] = malloc((MAX_j+1)*sizeof(char));
}
現在,僅僅是明確的,你可以訪問的最大元素是array2d[MAX_i][MAX_j]
。
完成後不要忘記反轉過程:
for (i = 0; i < (MAX_i+1); i++)
{
free(array2d[i]);
}
free(array2d);
現在,使用這種方法,下標符號仍然有效,所以array2d[x][y]
還訪問權價值。從字面上看,array2d
是一個指針數組,每個array2d[i]
也是如此。
爲什麼這是一個更好的方法?那麼,如果你喜歡,你可以有可變大小的子數組。你所要做的就是改變for循環。這種技術經常用於字符串數組,特別是在應用程序的int main(int argc, char** argv)
簽名中。 argv
是一個可變長度字符串數組的數組。使用strlen()
來確定它們的長度。
你能通過嗎?當然。你剛剛收到它的主,對於初學者,但你也可以寫你的函數簽名如下所示:
int foo(char** ar2d, const unsigned int size);
,並稱之爲:
char** somearray;
/* initialisation of the above */
foo(ar2d, thesizeofar2d);
/* when done, free somearray appropriately */
只是要清楚,你包括尺寸參數的方法(如const unsigned int size
)是非常好的做法,你應該堅持下去。
嘗試將指針傳遞給數組 – 2011-01-20 01:48:48