博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 引用本质的详解
阅读量:5308 次
发布时间:2019-06-14

本文共 1894 字,大约阅读时间需要 6 分钟。

//引用本质的理解①#include
using namespace std;int GetA(){ int a = 10; return a;}int & GetB(){ int a = 10; printf("a的地址是%x\n", &a); return a;}void main(){ int a1 = 10, a2 = 0; 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");}

 

转载于:https://www.cnblogs.com/zhanggaofeng/p/5585885.html

你可能感兴趣的文章
Win7中不能调试windows service
查看>>
通过httplib2 探索的学习的最佳方式
查看>>
快来熟练使用 Mac 编程
查看>>
Node.js 入门:Express + Mongoose 基础使用
查看>>
一步步教你轻松学奇异值分解SVD降维算法
查看>>
使用pager进行分页
查看>>
UVA - 1592 Database
查看>>
Fine Uploader文件上传组件
查看>>
javascript中的传递参数
查看>>
objective-c overview(二)
查看>>
python查询mangodb
查看>>
consonant combination
查看>>
驱动的本质
查看>>
Swift的高级分享 - Swift中的逻辑控制器
查看>>
Swagger简单介绍
查看>>
Python数据分析入门案例
查看>>
vue-devtools 获取到 vuex store 和 Vue 实例的?
查看>>
Linux 中【./】和【/】和【.】之间有什么区别?
查看>>
内存地址对齐
查看>>
看门狗 (监控芯片)
查看>>