#include <iostream> using namespace std; int *&FuncTest(int *&p,int &m) { p=&m; return p; } void main() { int nN=12;int nM=122; int *np=&nN; cout<<"n地址:"<<&nN<<" m地址:"<<&nM<<endl; cout<<"初始p指向:"<<np<<endl; cout<<*FuncTest(np,nM)<<endl<<*np<<endl; cout<<np<<endl; cout<<"m值:"<<nM<<endl; }
这段代码测试函数将主函数中的实参指针np指向主函数中的变量m,显示如下图:
第三行为调用测试函数后返回的指向m的指针,并对其解引用之后的值,可以看到返回的指针地址中的值为m。
但第四行中,直接调用指针np的地址值时显示的还是n的值。
而第五、六行显示np确实也是指向了m,m的值确实也是122。
问题出在cout上,把一句cout分为两句后,
#include <iostream> using namespace std; int *&FuncTest(int *&p,int &m) { p=&m; return p; } void main() { int nN=12;int nM=122; int *np=&nN; cout<<"n地址:"<<&nN<<" m地址:"<<&nM<<endl; cout<<"初始p指向:"<<np<<endl; cout<<*FuncTest(np,nM)<<endl; cout<<*np<<endl; cout<<np<<endl; cout<<"m值:"<<nM<<endl; }
如下图:
这里如果把FuncTest中的形参int &m换成int m,则指针最终指向了一个测试函数体中的临时变量,如:
int *&FuncTest(int *&p,int m) { p=&m; return p; }
函数体中变量m的地址为0012FF20,指针np指向该地址,注意这是不安全的,因为函数调用之后销毁函数体中的变量,所以指针会指向一段没有对象的地址,由此引起不定性。