目录
讨论二级指针做输入的第一种内存模型的指针做函数参数的退化问题
二级指针的内存模型图
char * p1[3]={"123","456","789"};
char p2[3][4] = {"123","456","789"};
char **p3 = (char **)malloc(3*sizeof(char *));
for (i=0;i<3;i++)
{
p3[i] = (char *)malloc(12*sizeof(char));
sprintf(p3[i], "%d%d%d", i, i, i);
}
内存分配模型图如下:
另一种版本:
如上是二级指针模型的三种内存分配示例,画内存分配图,这是个基本功!
讨论二级指针做输入的第一种内存模型的指针做函数参数的退化问题
之前说的第一种内存模型是:"char *buf[33]"这种类型;
补充一个小问题
问如下两行代码有什么区别?
void main()
{
char * p1[] = {"123","456","789"}; //数组3*4 内存
char (* p2)[] = {"123","456","789"}; //一个指针 4个字节 会报错,说“初始值设定项太多”,
//因为原来就只分配4个字节的内存,结果存入的数据量肯定超4个字节了。
char (* p2)[]; //不会报错 ,因为编译器只管分配4个内存,其他的都不会管的 ,但是这样的写法没
//任何意义
char (* p2)[5]; // 这样写就有意义了:p2是一个指向数组的指针,每次跳5个字节。
}
第一行变量是一个数组(因为中括号的优先级高);
第二行变量在"* p2"处加了个小括号,说明前者的优先级高了,那么就是一个指针。
那么再追加一下二级指针的本质,问如下两行变量,有区别吗?答:没有任何区别!
中括号和星号的区别是什么?中括号只不过是C++编译器手动的给我们执行的"*p"操作。即便写成了第一行那种写法,C++编译器执行的时候也会退化成第二行那种方式去执行。
char *p[];
char **p;
指针数组的技术推演过程如下:
//指针数组做函数参数的推演过程
void printfArray(char *p[3]);
void printfArray(char *p[]);
void printfArray(char **p);
如果是一个指针数组,那么当指针做函数调用参数的时候,那退化过程就是如上所示的。
总结
至此,关于多级数组的指针做函数参数退化的问题,全部梳理完毕。