一、先说结论:
使用指针的指针的情况,1、用指针的指针操作指针数组中的元素 2、当形参和实参都是指针,且想通过形参值的改变来影响实参值的改变
二、通过例子来说
这里,我们想要创建一个能够用于动态分配内存的函数,在main函数中调用该方法并传递一个实参,GetMemory分配好内存后,再将该段内存的首地址传给实参
void GetMemory(char *p,int num)
{
p=(char*)malloc(sizeof(char)*num); //p是形参指向的地址
}
void main()
{
char *str=NULL;
GetMemory(str,100); //str是实参指向的地址,不能通过调用函数来申请内存
strcpy(str,"hello");
}
程序结束,看起来没什么问题也能编译通过,但却运行不了,为什么?
我们都知道C/C++的参数传递是值传递;
开始,str == NULL ->调用GetMemory 后,形参p创建好,并通过值传递也得到初始值 NULL -> 在GetMemory中p指向了一段分配好的内存,然后再函数结束后指针p消失
-->整个过程,str 唯一的作用就是把自己的NULL 值传递给了P,仅此而已
综上,形参是没法改变实参的值的
三、正确方法
void GetMemory(char **p,int num)
{
*p=(char*)malloc(sizeof(char)*num); //此时*p就变成了是形参本身的地址
}
void main()
{
char *str=NULL;
GetMemory(&str,100); //&str是实参的地址,所以实参和形参之间就可以直接调用
strcpy(str,"hello");
free(str);
}
分析: 开始,str == NULL (假设str的地址是A) --> 在main函数中调用GetMemory ,通过值传递,所以*p == A (注意不是p == A,p标号代表的是变量P的地址,用脚后跟想想变量P的地址怎么可能是变量str的地址(A)),--> GetMemory分配好内存后,把内存首地址复制给*p 等价于 复制给地址A (又因为编译后 地址A 和变量str等价),既str == 内存首地址,
综上就完成了通过函数分配内存