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

  • 相关阅读:
    lambda表达式
    Java的MongoDB驱动及读写策略
    MongDB主从复制、复制集
    PL/SQL练习
    MySQL数据库MyISAM和InnoDB存储引擎的比较(转)
    Java的垃圾回收概述
    springMVC源码浅析
    ActiveMQ使用总结
    常用的缓存产品比较
    Nginx+tomcat负载均衡并动静态分离
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106917.html
Copyright © 2011-2022 走看看