zoukankan      html  css  js  c++  java
  • 指针的引用在函数中的应用

    #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指向该地址,注意这是不安全的,因为函数调用之后销毁函数体中的变量,所以指针会指向一段没有对象的地址,由此引起不定性。

  • 相关阅读:
    VIJOS P1057盖房子 (动态规划)
    RQNOJ PID57 / 找啊找啊找GF
    RQNOJ PID302 / [NOIP2001]统计单词个数 (动态规划)
    hdu 3829 Cat VS Dog 最大独立集
    并查集 找k颗树使节点数最多
    在 Sublime Text 3 中配置编译和运行 Java 程序
    在 Sublime Text 3 中配置编译和运行 Java 程序
    StarUML license key
    StarUML license key
    测试对于list的sort与sorted的效率
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106917.html
Copyright © 2011-2022 走看看