二维数组及二维指针的传递及一些思考
2014-05-04 12:11
176 查看
二维数组和二位指针在程序知识中是一个难点,往往会将人弄得头昏眼花。总结一下这个难点的相关问题。
二维数组,顾名思义就是数组的数组;二维指针是指针的指针。首先,我们来看看二维数组和二维指针等价的问题。
在《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:
这个栗子不多解释,完全错误的传递。
栗子2:
此例中,prt = arry,正确,但是main函数不会返回arry的内容。
栗子3:
能返回arry[0].
栗子4:
二维数组,顾名思义就是数组的数组;二维指针是指针的指针。首先,我们来看看二维数组和二维指针等价的问题。
在《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:
#include <stdio.h> #include <string.h> void func(char **ptr) { char arry[6][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; }
这个栗子不多解释,完全错误的传递。
栗子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:
#include <stdio.h> #include <string.h> #include <malloc.h> void func(char **ptr) { char arry[6][30] = { "ABCDEFG", "HIJKLMN", "OPQ", "RST", "UVW", "XYZ", }; memcpy(ptr, arry, sizeof(arry)); } int main(int argc, char *argv[]) { char **ptr = NULL; ptr = (char **)malloc(180); func(ptr); printf("%s\n", ptr); free(ptr); return 0; }
能返回arry[0].
栗子4:
相关文章推荐
- 关于C语言的指针传递地址的一些思考
- 二维数组和二维指针的传递问题
- 二维指针、二维数组、指向数组的指针 函数参数传递
- 一维指针和二维指针指向二维数组的一些问题
- C/C++二维数组的参数传递与二维指针
- 关于二维数组与二维指针传递参数
- C++三种参数传递方法(值传递、指针传递、引用传递)的一些知识
- 二叉树算法引发的思考:指针参数传递、引用的陷阱
- 【错误记录】二维数组初始化,以二级指针传递函数参数
- 34-二维数组与二维指针
- 二维指针,二维数组,以及指向数组的指针的相关问题 .
- 关于指针作为参数传递的一些探讨
- 二维数组与二维指针(测试环境VS2015)
- 二维数组指针传递
- C++二维数组,指针常量与常量指针、常量参数传递、常量变量存储地址
- C++指针作为函数的参数进行传递时需要注意的一些问题
- 关于指针,地址总线的一些思考。
- 指针二维数组的传递与函数参数
- 讨论二维指针——动态建立二维数组
- 如何在C函数中传递指向二维数组的指针参数