//引用本质的理解①
#include<iostream>
using namespace std; int GetA(){
int a = ;
return a;
} int & GetB(){
int a = ;
printf("a的地址是%x\n", &a);
return a;
} void main(){
int a1 = , a2 = ;
a1 = GetA();
printf("a1的值是%d\n", a1);
//打印 10
//经过仔细观察内存发现 return a;这句话执行完毕后 c++编译器并没有立刻销毁a所标识的内存空间
//而是执行完 a1 = GetA(); 这个赋值操作之后 才会销毁内存空间
//所以 变量a1能够接受到局部变量a的值 打印10不是偶然成功的 a2 = GetB();
//前置说明 int &b=a;
//引用本质上就是个常指针 b是个指针 但是引用指针b的指向的内存空间不可以改变
//c++编译器内部完成的是 ①创建一个int * const类型的常指针 b
//② 将变量a的地址赋值给常指针 b
//当c++编译器发现有操作需要对(引用指针)b进行取值或者赋值操作的时候
//c++编译器会默认 对b进行一个 提领 *p操作----这都是c++编译器内部行为(所以c++才会这么慢 自己隐形的做了好多操作)
//例如 printf("b=%d\n",b); 此时本质上是 printf("b=%d\n",*b);
//又例如 b=20; 本质上是 *b=20;
//再次强调 默认对指针进行 提领 * 操作 只是c++对引用指针的一种特殊处理 ; c++编译器不会对别的指针 默认进行 提领 * 操作 //如此一来 我们来分析一下 函数 GetB()
//当GetB() return a;的时候 等于是 c++编译器定义了一个临时引用指针 temp
//将变量a的地址赋值给临时引用指针 temp
//执行 a2 = GetB(); 实际上是执行 a2=*temp; //经过仔细观察发现 return a;这句话执行完毕后 c++编译器并没有立刻销毁a所标识的内存空间
//而是执行完 a2 = GetB(); 这个复制操作之后 才会销毁局部变量a的内存空间
//所以此时的 a2=*temp; 完全有效
// "=" 赋值操作 是将局部变量a的值复制到 a2所标识的内存空间里 printf("a2的地址是%x\n", &a2); //打印 a4f754
printf("a2的值是%d\n", a2); //打印 10 int &a3 = GetB(); //同理 对于 int &a3 = GetB(); 本质上可以这样写 int &a3=*temp;
//此时 *temp是有值的 因为执行到 int &a3 = GetB();的时候 局部变量a的内存空间还没有被释放
//定义int &a3=*temp; 那么c++编译器 将把*temp的地址赋值给引用指针a3(a3=temp;)即会把指针temp的值赋值给指针a3
//引用指针temp的值 也就是 &a (a的地址)
//当执行 printf("a3的值是%d\n", a3); 本质上是执行 printf("a3的值是%d\n", *a3);
//但是int &a3 = GetB();执行完成之后 局部变量a的内存空间已经被释放了
//temp所指向的内存空间的数据已经被系统重置了 所以 *temp的数据只能是脏数据了 a3又等于 temp
//因此*a3得数据也是脏数据 printf("a3的地址是%x\n", &a3); // 打印 a4f664 此时 局部变量a的地址 也是 a4f664
printf("a3的值是%d\n", a3); //脏数据
system("pause");
}

C++ 引用本质的详解的更多相关文章

  1. HTTP POST GET 本质区别详解

    HTTP POST GET 本质区别详解 一 原理区别 一般在浏览器中输入网址访问资源都是通过GET方式:在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交 Ht ...

  2. 转-HTTP POST GET SOAP本质区别详解

    原文链接:HTTP POST GET SOAP本质区别详解 一 原理区别 一般在浏览器中输入网址访问资源都是通过GET方式:在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认 ...

  3. python引用和对象详解

    python引用和对象详解 @[马克飞象] python中变量名和对象是分离的 例子 1: a = 1 这是一个简单的赋值语句,整数 1 为一个对象,a 是一个引用,利用赋值语句,引用a指向了对象1. ...

  4. Java中对象、对象引用、堆、栈、值传递以及引用传递的详解

    Java中对象.对象引用.堆.栈.值传递以及引用传递的详解 1.对象和对象引用的差别: (1).对象: 万物皆对象.对象是类的实例. 在Java中new是用来在堆上创建对象用的. 一个对象能够被多个引 ...

  5. 引用 mkimage使用详解

    引用 鱼 的 mkimage使用详解  uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来 ...

  6. 引用 struts2标签详解 - wo的的日志 - 网易博客

    引用 元元 的 struts2标签详解   引用 COLD 的 struts2标签详解 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@t ...

  7. C++中引用和指针详解

    先来分析指针这个东东: 从概念上讲,指针本质上就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 上面的图表示了程序运行时变量的值 ...

  8. 【转】HTTP POST GET 本质区别详解

    一 原理区别 一般在浏览器中输入网址访问资源都是通过GET方式:在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交 Http定义了与服务器交互的不同方法,最基本的 ...

  9. 【转载】HTTP POST GET SOAP本质区别详解

    一 原理区别 一般在浏览器中输入网址访问资源都是通过GET方式:在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交 Http定义了与服务器交互的不同方法,最基本的 ...

随机推荐

  1. InnerHTML属性的XSS利用

    来自:http://www.myhack58.com/Article/html/3/7/2011/32395.htm innerHTML 是个奇怪的HTML属性,不是W3C标准支持的,但几乎所有的厂商 ...

  2. Edit Control响应全选(Ctrl+A)

    MFC中的Edit控件用于输入数据,当输入的数据为大段数字的时候,全选功能就显得非常重要了,可偏偏在MFC中Edit控件就不 支持全选.Ctrl+A不行,双击也不行. Ctrl+C和Ctrl+V都是默 ...

  3. 算法笔记_155:算法提高 概率计算(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 生成n个∈[a,b]的随机整数,输出它们的和为x的概率. 输入格式 一行输入四个整数依次为n,a,b,x,用空格分隔. 输出格式 输出一行 ...

  4. Python——极限编程

    很cool的名字,极限编程(Extreme Programming,简写XP)是编程的一种流行趋势: (1)首先是对目标进行计划: (2)然后将测试用例集合编写为一种框架: (3)之后才编写实际的代码 ...

  5. UG NX9.0.0 for linux安装

    自:http://vivianyw.blog.163.com/blog/static/13454742220145601415881/?latestBlog NX9.0.0 for linux安装. ...

  6. 查看Buffer Pool使用情况--[转]

    ----源自:微软官方博客论坛 我的SQL Server buffer pool很大,有办法知道是哪些对象吃掉我的buffer Pool内存么?比方说,能否知道是哪个数据库,哪个表,哪个index占用 ...

  7. CRC文件解压缩问题

    CRC问题一般有三种可能1.你的硬盘出现坏道2.你的硬盘数据线受损3.还可能是主板和内存的问题 硬盘坏道的表现硬盘使用久了就可能出现各种各样的问题,而硬盘“坏道”便是这其中最常见的问题.硬盘出现坏道除 ...

  8. 移动UI设计中需要避免的四种常见用户体验误区

    2012年移动应用的下载量超过300 亿,可是智能手机用户平均每周会使用的应用数却大概只有15个.更糟的是,Localytics 的研究表明,大概有22%的应用是见光死,用过一次之后就被束之高阁.既然 ...

  9. python笔记-列表和元组

    列表和元组: -可以将列表和元组当成普通的数组 -列表和元组可以保存任意类型的python对象 -通过从0开始的数字索引访问元素 -列表和元组可以存储不同类型的对象 列表和元组的区别: -列表元素使用 ...

  10. Python的ipython的安装

    IPython是Python 的原生交互式 shell 的增强版,可以完成许多不同寻常的任务,比如帮助实现并行化计算:主要使用它提供的交互性帮助,比如代码着色.改进了的命令行回调.制表符完成.宏功能以 ...