如何理解双重指针

单重指针已经够蛋疼了,c语言中还引入了双重指针,甚至若干重指针。使得这个情况变得更加复杂。虽然以前一直觉得双重指针也不过如此,指针的指针嘛,还不是照样理解,但是上一次重删代码中,因为管理海量数据,引入了大量的指针操作,并且为了函数封装,采用了指针作为参数来传递。因此出现了较多问题,现在感觉很有必要写一篇有关双重指针的博文。


先看一个例子:

程序1

void change(char* p)  
{
    p = "bbb";
}
int main(int argc, char* argv[])
{
    char *v = "aaa";
    change(v);
    printf("%s",v);
    return 0;
}
 

我们发现输出的结果仍然是aaa。

对它进行修改:

程序2

void change(char** p)
{
    *p = "bbb";
}
 
int main(int argc, char* argv[])
{
    char *v = "aaa";
    change(&v);
   printf("%s",v);    
   return 0;
}

 

此时输出的结果为bbb.

分析:

出现以上现象的原因是因为这个函数调用的时候,这个指针作为参数传递问题。程序1中,实际上,当我们调用函数change,把指针char*v,当做参数传入的时候,这里还隐藏了一个赋值的操作,也就是说,传入到change函数中的是另外某个参数char* x,x=v;所以说最后改变的只不过是x,v指向的东西并没有改变,所以输出来,还是aaa。如下图所示:

 

在程序2,操作过程中,指针v本身的地址值始终没有改变,改变的是指针v所指向的地址变化了。它不再指向”aaa”所在的地址,而是”bbb”所在的地址。如下图所示:

 

总结

当指针作为函数参数传递的时候,如果想改变指针所指向的地址,比如想把char*v,从指向“aaa”转到指向“bbb”,那么需要采用双重指针传递的方式。或者说想通过调用函数的方式,给指针用malloc 分配新的地址的时候,也需要采用双重指针,才能实现真正的分配,否则是分配不成功的。

而如果只是想改变,指针所指向的地址里面的内容的时候,则采用单重指针就可以了,比如想把“aaa”改成“aab”,那么直接用单重指针传递就ok了,因为指针指向的地址不需要改变。代码就应该写成,如下:

程序3

void change(char* p)  
{
    *(p+2) = 'b';
}
int main(int argc, char* argv[])
{
    char *v = "aaa";
    change(v);
    printf("%s",v);
    return 0;
}

如下图:


原文来自:http://blog.163.com/huangguoqiang_123@126/blog/static/1410431142012397331477/

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值