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

  • 相关阅读:
    MySQL模糊匹配查询like、regexp、in
    MySQL数据库——表操作
    (转)MySQL join语法解析与性能分析
    (转)解决 TortoiseGit 诡异的 Bad file number 问题
    四、windows下TortoiseGit的使用与操作
    (转)创建GitHub技术博客
    二、Windows下TortoiseGit的安装与配置
    三、TortoiseGit之配置密钥
    集训之6-26模拟赛一
    集训之各种dp
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106917.html
Copyright © 2011-2022 走看看