二维数组及二维指针的传递及一些思考(转)
二维数组和二位指针在程序知识中是一个难点,往往会将人弄得头昏眼花。总结一下这个难点的相关问题。
二维数组,顾名思义就是数组的数组;二维指针是指针的指针。首先,我们来看看二维数组和二维指针等价的问题。
在《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].
https://www.cnblogs.com/majiangjiang/p/3706472.html

浙公网安备 33010602011771号