二維數組和二位指針在程序知識中是一個難點,往往會將人弄得頭昏眼花。總結一下這個難點的相關問題。
二維數組,顧名思義就是數組的數組;二維指針是指針的指針。首先,我們來看看二維數組和二維指針等價的問題。
在《C專家編程》10.3節的小啟發里講的很透徹:(以下這段文字及對比一定要認真分析!)
數組和指針參數是如何被編譯器修改的?
“數組名被改寫成一個指針參數”規則並不是遞歸定義的。數組的數組會被改寫成“數組的指針”,而不是“指針的指針”:
實參 所匹配的形參
數組的數組 char c[8][10]; char (*)[10]; 數組指針
指針數組 char *c[10]; char **c; 指針的指針
數組指針(行指針) char (*c)[10]; char (*c)[10]; 不改變
指針的指針 char **c; char **c; 不改變
可仔細體會一下上述表格,如果能理解,那是極好的,如果不能,我將舉個栗子來幫助理解。
栗子1:
1 #include <stdio.h> 2 #include <string.h> 3 4 void func(char **ptr) 5 { 6 char arry[6][30] = 7 { 8 "ABCDEFG", 9 "HIJKLMN", 10 "OPQ", 11 "RST", 12 "UVW", 13 "XYZ", 14 }; 15 ptr = arry; 16 } 17 18 int main(int argc, char *argv[]) 19 { 20 char **ptr = NULL; 21 func(ptr); 22 printf("%s\n", ptr); 23 return 0; 24 }
這個栗子不多解釋,完全錯誤的傳遞。
栗子2:
#include <stdio.h> #include <string.h> void func(char **ptr) { char *arry[30] = { "ABCDEFG", "HIJKLMN", "OPQ", "RST", "UVW", "XYZ", }; ptr = arry; } int main(int argc, char *argv[]) { char **ptr = NULL; func(ptr); printf("%s\n", ptr); return 0; }
此例中,prt = arry,正確,但是main函數不會返回arry的內容。
栗子3:
1 #include <stdio.h> 2 #include <string.h> 3 #include <malloc.h> 4 5 void func(char **ptr) 6 { 7 char arry[6][30] = 8 { 9 "ABCDEFG", 10 "HIJKLMN", 11 "OPQ", 12 "RST", 13 "UVW", 14 "XYZ", 15 }; 16 memcpy(ptr, arry, sizeof(arry)); 17 } 18 19 int main(int argc, char *argv[]) 20 { 21 char **ptr = NULL; 22 ptr = (char **)malloc(180); 23 func(ptr); 24 printf("%s\n", ptr); 25 free(ptr); 26 return 0; 27 }
能返回arry[0].
栗子4: