1.指针就是数据或代码在内存中的地址,指针变量指向的就是内存中的数据或代码。这里有一个关键词需要强调,就是内存,指针只能指向内存,不能指向寄存器或者硬盘,因为寄存器和硬盘没法寻址。
2.其实 C++ 代码中的大部分内容都是放在内存中的,例如定义的变量、创建的对象、字符串常量、函数形参、函数体本身、new或malloc()分配的内存等,这些内容都可以用&来获取地址,进而用指针指向它们。除此之外,还有一些我们平时不太留意的临时数据,例如表达式的结果、函数的返回值等,它们可能会放在内存中,也可能会放在寄存器中。一旦它们被放到了寄存器中,就没法用&获取它们的地址了,也就没法用指针指向它们了。
3.寄存器离 CPU 近,并且速度比内存快,将临时数据放到寄存器是为了加快程序运行。但是寄存器的数量是非常有限的,容纳不下较大的数据,所以只能将较小的临时数据放在寄存器中。int、double、bool、char 等基本类型的数据往往不超过 8 个字节,用一两个寄存器就能存储,所以这些类型的临时数据通常会放到寄存器中;而对象、结构体变量是自定义类型的数据,大小不可预测,所以这些类型的临时数据通常会放到内存中。
4.常量表达式由于不包含变量,没有不稳定因素,所以在编译阶段就能求值。编译器不会分配单独的内存来存储常量表达式的值,而是将常量表达式的值和代码合并到一起,放到虚拟地址空间中的代码区。从汇编的角度看,常量表达式的值就是一个立即数,会被“硬编码”到指令中,不能寻址。
5.引用和指针在本质上是一样的,引用仅仅是对指针进行了简单的封装。引用和指针都不能绑定到无法寻址的临时数据,并且 C++ 对引用的要求更加严格,在某些编译器下甚至连放在内存中的临时数据都不能指代。

着重看下这里
6. 引用 与 const组合在一起,类似 const int &r1,就变成了常引用
将常引用绑定到临时数据时,编译器采取了一种妥协机制:编译器会为临时数据创建一个新的、无名的临时变量,并将临时数据放入该临时变量中,然后再将引用绑定到该临时变量。注意,临时变量也是变量,所有的变量都会被分配内存。

7.编译器禁止指针指向不同类型的数据
引用(Reference)和指针(Pointer)在本质上是一样的,引用仅仅是对指针进行了简单的封装,「类型严格一致」这条规则同样也适用于引用。
7. const 引用与类型转换
当对引用添加 const 限定后,情况就又发生了变化,编译器允许引用绑定到类型不一致的数据,当引用的类型和数据的类型不一致时,如果它们的类型是相近的,并且遵守「数据类型的自动转换」规则,那么编译器就会创建一个临时变量,并将数据赋值给这个临时变量(这时候会发生自动类型转换),然后再将引用绑定到这个临时的变量,这与「将 const 引用绑定到临时数据时」采用的方案是一样的。
8.
给引用添加 const 限定后,不但可以将引用绑定到临时数据,还可以将引用绑定到类型相近的数据,这使得引用更加灵活和通用,它们背后的机制都是临时变量。
引用类型的函数形参请尽可能的使用 const
使用 const 可以避免无意中修改数据的编程错误;
使用 const 能让函数接收 const 和非 const 类型的实参,否则将只能接收非 const 类型的实参;
使用 const 引用能够让函数正确生成并使用临时变量。

C++ 对引用的理解2相关推荐

  1. 我对对象和引用的理解

    注:看了靖宝华的文章<对"类"和"对象"的深度揣摩与思考...(java初学者)>,我想说一下,在创建一个类对象的情况下,我对"对象&qu ...

  2. 使用java理解程序逻辑 第十二章_Java弱引用的理解与使用

    Java弱引用的理解与使用 WeakReference 前言 看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. ...

  3. java的弱引用_理解Java中的弱引用(Weak Reference)

    本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出, ...

  4. 对java 链表删除节点 引用误区理解:对局部变量 cur= cur.next及cur.next=cur.next.next,及cur.next = cur.next.next.next的理解图解

    对java 链表删除节点 引用误区理解: 对java 链表删除节点 引用误区理解: 对局部变量 cur= cur.next及cur.next=cur.next.next,及cur.next = cur ...

  5. [iOS]-NSTimer与循环引用的理解

    目录: 参考的博客: 问题引入 循环引用 简单的循环引用 Block中的循环引用强弱共舞 Delegate中的循环引用 NSTimer 创建NSTimer 销毁NSTimer invalidate f ...

  6. 回过头来看对象的四种状态强软弱虚引用的理解

    一.对象的四种引用状态描述 在JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference).软引用(Soft Reference).弱引用(Weak Refe ...

  7. java强引用软引用深刻理解_Java-强引用、软引用、弱引用、虚引用

    为什么有多种引用 <深入理解JVM虚拟机>一书中提到了Java中的4种引用,分别是强引用.软引用.弱引用.虚引用,为什么要分这么多种引用呢?这是因为每一种引用的生命周期都不相同,准确的说垃 ...

  8. python中的引用怎么理解_python 引用和对象理解

    今天浏览博客的时候看到这么一句话: python中变量名和对象是分离的:最开始的时候是看到这句话的时候没有反应过来.决定具体搞清楚一下python中变量与对象之间的细节.(其实我感觉应该说 引用和对象 ...

  9. python中的引用怎么理解_Python函数通过引用调用

    基本上有三种'函数调用':通过价值 通过引用传递 通过对象引用传递 Python是一种PASS-BY-OBJECT-REFERENCE编程语言. 首先,重要的是要理解一个变量,变量(对象)的值是两个独 ...

  10. Java中对象和引用的理解

    2019独角兽企业重金招聘Python工程师标准>>> 偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两 ...

最新文章

  1. c语言课设代写一般多少钱_厕所疏通一般多少钱
  2. javascript函数练习1
  3. 网站不允许上传asp cer cdx htr等文件时
  4. 算法学习之路|称量硬币(模拟)
  5. [转]IIS 允许/禁止 目录浏览
  6. OpenCV3.4.5带GPU编译error: #error This file requires compiler and library support for the ISO C++ 2011
  7. 如何使用ArchUnit测试Java项目的体系结构
  8. python创建person类用printinfo方法_Python学习期刊Day11类和对象(2),日记,与,下
  9. 为什么会找不到D层文件?
  10. Fizz Buzz @leetcode Math
  11. 盖茨与鲍尔默愤而诉Google 李开复离职有内情 -- ,买skype来控制桌面建立渠道吧
  12. 半年学习tse的总结
  13. 怎么还原计算机系统还原,怎么还原以前版本的windows?Win7/Win10系统还原方法
  14. aptx与ldac音质区别_ldac_aptx和aptx hd功能介绍及区别介绍
  15. m基于FPGA的通信数据帧加扰解扰verilog实现,包含testbench
  16. 数字孪生智慧医院:构建三维人体监测可视化管理平台(三)
  17. 数据库连接失败: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
  18. WPF 一个性能比较好的 gif 解析库
  19. 使用hive制作一张日历表
  20. Ichorbio/艾美捷 研究级阿达木单抗生物仿制药

热门文章

  1. html笔记(一)html4+css2.0、css基础和属性、盒模型
  2. loj2090. 「ZJOI2016」旅行者
  3. 【 jquery 】常用
  4. SQL Server 关于列的权限控制
  5. python链表的实现,有注释
  6. 网页性能优化(初窥)
  7. Linux SPI框架
  8. 华中师范大学邮箱matlab,18春[华中师范大学]华师《Matlab基础与应用》在线作业1(100分)...
  9. oracle锁表会话超时时间,ORACLE快速彻底Kill掉的会话,防止锁表
  10. Mysql函数访问oracle,Oracle与MySql函数