二维数组和二位指针在程序知识中是一个难点,往往会将人弄得头昏眼花。总结一下这个难点的相关问题。
二维数组,顾名思义就是数组的数组;二维指针是指针的指针。首先,我们来看看二维数组和二维指针等价的问题。
在《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 ", 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 ", 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 ", ptr); 25 free(ptr); 26 return 0; 27 }
能返回arry[0].
https://www.cnblogs.com/majiangjiang/p/3706472.html