C++中指针形参问题
2013-07-30 10:13
204 查看
1.C++指针做形参,会有很多陷阱,很多时候也许并不如我们想的那样。比如我们想通过一个函数改变指针的值:
这段代码明显想通过函数改变p1的值,但是结果却没有变化,输出仍旧是1。问题就出在关键点那里!
2、再看一个代码:
这段代码却能够改变输出值。区别就在*p=a与p=&a之间。
3.《C++ primer(第四版)》105页可以发现其中的解释:
对p=&a,称之为给指针赋值,意思是给指针本身一个指向的对象。
而对*p=a称之为通过指针进行赋值,意思是改变指针所指对象的值。
解释如下:对于p=&a,就是把函数形参指针p指向a(给指针赋值,赋上a的地址即可指向a),临时变量a在函数调用完之后就不复存在,实参p1
也不会被改变,*p1=4;而*p=a就是通过指针进行赋值,也就是说*p是指指针p指向的值,给*p赋值a,就是给*p所指向的值赋值,指针传参传给形参p的是x的地址,也就是说在函数中*p其实表示给x赋值,这样即使局部变量a消失了,但是x的值早已通过指针真正改变了。
#include<</SPAN>iostream> using namespace std; void test_point(int *p) { int a=2; p=&a; //关键点 } int main() { int x=1; int *p1=&x; test_point(p1); cout<<*p1<<endl; return 0; }
这段代码明显想通过函数改变p1的值,但是结果却没有变化,输出仍旧是1。问题就出在关键点那里!
2、再看一个代码:
#include<</SPAN>iostream> using namespace std; void test_point(int *p) { int a=2; *p=a; //关键地方,体会与上一段代码的不同 } int main() { int x=1; int *p1=&x; test_point(p1); cout<<*p1<<endl; return 0; }
这段代码却能够改变输出值。区别就在*p=a与p=&a之间。
3.《C++ primer(第四版)》105页可以发现其中的解释:
对p=&a,称之为给指针赋值,意思是给指针本身一个指向的对象。
而对*p=a称之为通过指针进行赋值,意思是改变指针所指对象的值。
解释如下:对于p=&a,就是把函数形参指针p指向a(给指针赋值,赋上a的地址即可指向a),临时变量a在函数调用完之后就不复存在,实参p1
也不会被改变,*p1=4;而*p=a就是通过指针进行赋值,也就是说*p是指指针p指向的值,给*p赋值a,就是给*p所指向的值赋值,指针传参传给形参p的是x的地址,也就是说在函数中*p其实表示给x赋值,这样即使局部变量a消失了,但是x的值早已通过指针真正改变了。
相关文章推荐
- C++智能指针的问题
- c++关于顺序容器指针迭代器失效问题
- C++内存问题大集合(指针问题,以及字符串拷贝问题,确实挺危险的)
- 有关c/c++指针的金典问题
- 关于C++和Java的引用和指针的问题
- 【引用】C/C++中指针和引用之相关问题研究
- [笔试题 2][c/c++]关于指针直接赋值问题
- C/C++中指针和引用之相关问题研究
- 【C++】C++问题——类模板分离编译、函数对象、智能指针
- C++ 引用变量(十二)-- & b *b和C的传递指针形参一样效果
- 关于实际项目中C++(MFC)指针问题的解决过程
- C++中函数用普通变量,指针,引用做形参的区别
- C++指针参数问题讨论
- 一定要注意c++父类与子类指针步长的问题!
- C++动态数组,多重指针问题
- C++中的指针悬挂问题(内存泄漏)
- 理解对C++裸指针释放后重用的问题
- 【C/C++】关于引用和指针的问题
- C/C++中指针和引用之相关问题研究
- c++之指针作为函数参数传递的问题