C语言 在被调函数中改变指针变量值的方法

先看一段代码:

#include <iostream> 
void foo(char *p)
{
   p = "after foo()";
}     
void main()
{
   char *p = "before foo()";
   foo(p);     
   cout <<p <<endl;   
}

如果你指望函数foo能帮你改变p的值,那你就错了。因为指针也是变量,它在函数调用过程中也是传值调用的(C中函数参数都是传值调用)。函数foo中的p只是局部变量,它的作用域仅在子函数中。上面这段代码其实和下面这段效果是类似的:

#include <iostream> 
void foo(int i)
{
   i = 1;
}     
void main()
{
   int i = 0;
   foo(i);     
   cout <<i<<endl;   
}

这是foo函数显然不会修改i的值,对于第一段代码的指针,也是同样的道理。都是变量的传值调用,一个是整形变量,一个是指针变量而已。

那么,如何修改代码才能得到我们想要的效果呢?有三种方法。

一、使用return

#include <iostream.h>
char* foo()
{
 char* p = "after foo()";
 return p;
}
void main()
{
 char* p = "before foo()";
 p = foo();
 cout<<p<<endl;
}

二、使用指针引用

#include <iostream> 
void foo(char *& q)
{
   q = "after foo()";
}     
void main()
{
   char *p = "before foo()";
   foo(p);     
   cout <<p <<endl;   
}

该程序将p的地址传给foo,则p=&q,而p是字符串变量的内存地址,那么&q也是字符串变量的内存地址,则q也是指向该字符串变量所在内存的指针。
简单的说foo中的q这时是p的引用(别名),q和p共享同一个内存空间。这时在foo中修改q指向的内存空间的字符串内容,main中p的值当然也随之变化。

三、使用指向指针的指针

#include <iostream.h> 
void foo(char ** p)
{
   *p = "after foo()";
}     
void main()

   char **p = "before foo()";   
   foo(p);     
   cout <<*p<<endl;   
}

main中p是指向指针的指针,即它的值的值是指向字符串变量内存的指针的地址,在foo中*p就表示该指针,即字符串变量内存的地址。所以修改*p的值自然可以修改该内存的内容。

下面一段程序使用了同样的原理:

#include <iostream.h> 
void foo(char ** p)
{
   *p = "after foo()";
}     
void main()

   char *p = "before foo()";   
   foo(&p);     
   cout <<p<<endl;   
}

参考:

引用和指针的区别:http://www.iteye.com/topic/69378

c++中指针,指针的引用,指针的指针的区别 http://www.cppblog.com/mzty/archive/2006/07/07/9531.html

指针和指针的引用 http://www.cnblogs.com/no7dw/archive/2011/03/19/1988540.html

C语言函数指针参数也是传值调用 http://blog.csdn.net/mantian22/article/details/1357676


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值