理解“指针的指针”

一、先说结论:

  使用指针的指针的情况,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 == 内存首地址,

综上就完成了通过函数分配内存


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值