二維數組和二位指針在程序知識中是一個難點,每每會將人弄得頭昏眼花。總結一下這個難點的相關問題。編程
二維數組,顧名思義就是數組的數組;二維指針是指針的指針。首先,咱們來看看二維數組和二維指針等價的問題。數組
在《C專家編程》10.3節的小啓發裏講的很透徹:(如下這段文字及對比必定要認真分析!)函數
數組和指針參數是如何被編譯器修改的?spa
「數組名被改寫成一個指針參數」規則並非遞歸定義的。數組的數組會被改寫成「數組的指針」,而不是「指針的指針」:指針
實參 所匹配的形參code
數組的數組 char c[8][10]; char (*)[10]; 數組指針blog
指針數組 char *c[10]; char **c; 指針的指針遞歸
數組指針(行指針) char (*c)[10]; char (*c)[10]; 不改變編譯器
指針的指針 char **c; char **c; 不改變string
可仔細體會一下上述表格,若是能理解,那是極好的,若是不能,我將舉個栗子來幫助理解。
栗子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: