赞
踩
先看一段代码:
#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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。