引用变量和指针变量初探
1. 引用变量其实和指针变量在内部实现上是一样的(包括定义、作为右值等操作)。
2. 引用变量与指针变量本身在符号表中的保存机制不一样的(符号表中保存变量的名字以及其地址)。指针变量保存的地址是指针变量自身的地址、而引用变量保存的是其引用对象的地址值。(这个结论也可以用来说明引用的一些特性:声明时就要初始化,因为其符号表中保存的地址要用其对象的地址,对象不初始化就没有分配内存,没有地址;引用的对象初始化后不能被改变了,因为符号表本身创建了之后是不能再被修改的。)
下面看一下编译器是如何处理指针和引用的:
int i = 10;004113EE mov dword ptr [i],0Ahint* p = &i;004113F5 lea eax,[i]004113F8 mov dword ptr [p],eaxint &r = i;004113FB lea eax,[i]004113FE mov dword ptr [r],eax //指针和引用的保存的都是对象的地址,本质上是一样的int k = i;00411401 mov eax,dword ptr [i]00411404 mov dword ptr [k],eaxint m = *p;00411407 mov eax,dword ptr [p]0041140A mov ecx,dword ptr [eax]0041140C mov dword ptr [m],ecxint n = r;0041140F mov eax,dword ptr [r]00411412 mov ecx,dword ptr [eax] //变量r的值其实是地址,只是编译器在其作为右值时,做了一步转化00411414 mov dword ptr [n],ecxcout<<(&r)<<endl;004138A1 mov esi,esp004138A3 mov eax,dword ptr [__imp_std::endl (4182ACh)]004138A8 push eax 004138A9 mov edi,esp004138AB mov ecx,dword ptr [r] //对r进行取址时,编译器其实是取的值,也就是之前变量i的地址004138AE push ecx 004138AF mov ecx,dword ptr [__imp_std::cout (4182A0h)]004138B5 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (4182A4h)]004138BB cmp edi,esp004138BD call @ILT+335(__RTC_CheckEsp) (411154h)004138C2 mov ecx,eax004138C4 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (4182A8h)]004138CA cmp esi,esp004138CC call @ILT+335(__RTC_CheckEsp) (411154h)
转载于:https://www.cnblogs.com/ripya/archive/2012/06/06/2537997.html
引用变量和指针变量初探相关推荐
- go 指针变量和普通变量的转化_C语言 | 指向结构体变量的指针变量
"要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人-万中无一" --包租婆这道理放在C语言学习上也一并受用.在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语 ...
- 指向结构体变量的指针变量
指向结构体变量的指针变量的定义形式与一般指针变量的定义形式相同,只是将其指向类型定义为结构体类型即可.例如: struct person {char name[20];char sex;int age ...
- C语言 变量的指针和指向变量的指针变量
一.指针变量的定义 变量的指针就是变量的地址.我们可以定义一个指向 变量(普通变量) 的 指针变量.这种指针变量,我们在定义的时候,会引入一个 * ,用于在定义的语句中表示"这是一个指针变量 ...
- 变量的指针和指向变量的指针变量
指针和指针变量的定义: 一个变量的地址称为该变量的"指针" 例如,地址1000是变量i的指针.如果有一个变量专门用来存放另一变量的地址(即指针),则它称为"指针变量&qu ...
- C语言中数组变量和指针变量
指针变量为什么需要类型? 数组变量和指针变量在使用sizeof时不同,sizeof(数组变量)是数组长度,sizeof(指针变量)是存储int的字节长度4或者8(64bit). 数组变量在参数传递中, ...
- C++定义指针变量 | 使用指针变量
C++指针变量的定义 C++规定所有变量在使用前必须先定义,即指定其类型,在编译时按变量类型分配存储空间,对指针 变量必须将它定义为指针类型. //定义整型变量 int i,j;//定义指针变量 in ...
- 变量与指针变量的区别
谈一般变量与指针变量的区别 一. 首先我们要知道变量访问有两种方式 1 . 变量名 : 例如 int a = 10 i+j = 10 2 . 地址 :顾名思义它表示的是一个变量 ...
- 指针,指针变量,指针变量指向的一些理解
对于指针,指针变量,指针变量(通常简写成指针)指向的一些理解 1.指针的定义: 首先假设有一个内存单元,每一个内存单元对应着一个相应的编号,即为该内存单元的地址,该地址也就是我们所说的指针. 2.指针 ...
- C 判断 —— if...else 语句(bool变量、float变量、指针变量与“零值”进行比较)(else 到底与哪个 if 配对呢? if 语句后面的分号?)
1.bool 变量与"零值"进行比较 bool 变量与"零值"进行比较的 if 语句怎么写? bool bTestFlag = FALSE;//想想为什么一般初 ...
最新文章
- pytorch 归一化与反归一化
- 关于停断电后电脑自动开机重启的问题
- 《穿靴子的猫》蓝光720P 1080P高清中英双字 下载
- 数据处理-Batch Normalization
- jpa 托管_java – jpa非托管实体
- LGD:涨点神器!旷视孙剑、张祥雨团队提出标签引导的自蒸馏技术,助力目标检测!...
- 计算机专业理论模拟试题A,高职对口招生考试模拟试题计算机专业网络模拟题...
- 【转】WPF 窗体淡入淡出动画
- MyBatis 拦截器 (实现分页功能)
- 启动Elasticsearch时:[failed to obtain node locks]
- Android获取手机传感器数据实时展示,并存储在数据文件中
- 日天的终生大事(dp)
- 不得转载可以转发吗_微信公众号可以复制转载别人的文章吗?如何转发其他公众号文章?...
- 数据结构 散列表 除留余数法 线性探测法解决冲突
- 时事评论--公众有权知道“砒霜门“的真像
- 程序员吐槽:四年被三家公司裁员补偿,网友:去BAT转转?
- 2022中国中医药产业展,山东医药保健展,济南药交会9月举办
- 第十一届“认证杯”数学中国数学建模国际赛 (D题)
- 会场音乐 播放器 适合上场、休息等
- UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multibyte sequence
热门文章
- mysql my.cnf key_buffer_size_优化mysql之key_buffer_size设置
- c++ 定时器_【话说定时器系列】之十:PWM输入模式测量脉宽及占空比实验
- 基于笛卡尔坐标系下的三边定位的研究(TOA方式定位)
- Qt 模型视图框架解读之模型
- mysql 接口访问_MySQL的数据库访问接口-阿里云开发者社区
- 电脑屏幕保护怎么取消_怎么监控员工电脑?老板如何知道员工上班在干什么?...
- XML与Web数据挖掘
- C++三大继承构造函数的执行顺序详解
- HDU 6136 Death Podracing (堆)
- springboot 源码_springboot框架源码分享