如何使用双重指针

双重指针的使用

单重指针已经够蛋疼了,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;

}

如下图:
  
  
如何理解双重指针 - 黄绿红 - 民富国强的博客
 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值