双重指针的使用

这几天看yolov3程序,里面有双重指针的调用,不是很了解,所以转载了双重指针的用法这篇文章。

首先看一道习题:

char GetMemory(char *memorystr,u8 num)
{
    memorystr = (char*)malloc(num);
}
 
int main(void)
{
    char *str = NULL;
    GetMemory(str,6);
    memcpy(str,"china",5);
} 

请问上面代码,可以为str开辟一个空间并且把”china” 拷贝到其中吗? 
分析: 
要了解这个问题,我们需要先了解函数调用的过程: 
1)首先把实参的值赋给形参,然后把控制流转到被调用函数。 
2)执行被调用函数。 
注意形参改变是不会影响到实参的值。我们再分析GetMemory(str,6),实参是一个空指针str,形参为memorystr,调用时,把str赋给memorystr,然后执行memorystr = (char*)malloc(num);,这时候 memorystr获得了6个char空间,但是因为形参改变不会影响到实参的值,str的值并没改变,还是NULL,所以上面拷贝不成功。 
我们根据下图来说明: 

ps: 我们平常使用指针把参数从函数中传递出来,传递的是指针所指向的内容,而非指针本身,而上的例子企图改变的是指针本身。

如果例子想达到目的,该怎么改呢? 我们可以使用双重指针实现。所谓双重指针,也称为二维指针,声明形式 
类型名 **指针名, eg: char **p, 含义是指向指针的指针。 
如下图: 

char **p = “123”: 
1)首先申请了一个空间,我们假设地址为a,a地址内容是p,p是一个二级指针,指向以p为地址的空间,则其内容为*p。 
2)*p时一个一级指针,指向以*p为地址的空间,该空间存储的是”123” 
3)引用二级指针,修改*p 的值就可以改变二级指针(**p)所指向的地址。通过函数参数形式修改指针地址,一般使用二级指针。 
eg: 
char **p =”123” , *a = “456”; *p = a; 这时候,**p指向的内容是“456”

根据这些知识,我们修改上面的例程,以实现其功能

char GetMemory(char **memorystr,u8 num)// 使用二级指针
{
    *memorystr = (char*)malloc(num);// 这里是赋值给*memorystr 
}
 
int main(void)
{
    char *str = NULL;
    GetMemory(&str,6);// 取str的地址
    memcpy(str,"china",5);
} 

分析: 
1、GetMemory(&str,6);// 取str的地址,赋给了二级指针memorystr, 那么*memorystr就是取&str地址的内容,即str,两者完全等价。如果*memorystr改变,那么str也会改变。

2、*memorystr = (char*)malloc(num);// 申请num个char空间给*memorystr,也就是给str申请了num个char空间。

3、最后把字符串copy到china 中。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值