在子函数中改变指针变量的值的方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jack237/article/details/7355995

先看一段代码:

#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

展开阅读全文

没有更多推荐了,返回首页