我们知道,指针就是数据或代码在内存中的地址,指针变量指向的就是内存中的数据或代码。这里有一个关键词需要强调,就是内存,指针只能指向内存,不能指向寄存器或者硬盘,因为寄存器和硬盘没法寻址。

其实 C++ 代码中的大部分内容都是放在内存中的,例如定义的变量、创建的对象、字符串常量、函数形参、函数体本身、new或malloc()分配的内存等,这些内容都可以用&来获取地址,进而用指针指向它们。除此之外,还有一些我们平时不太留意的临时数据,例如表达式的结果、函数的返回值等,它们可能会放在内存中,也可能会放在寄存器中。一旦它们被放到了寄存器中,就没法用&获取它们的地址了,也就没法用指针指向它们了。

下面的代码演示了表达式所产生的临时结果:
这些表达式的结果都会被放到寄存器中,尝试用&获取它们的地址都是错误的。

int n = 100, m = 200;
int *p1 = &(m + n);    //m + n 的结果为 300
int *p2 = &(n + 100);  //n + 100 的结果为 200
bool *p4 = &(m < n);   //m < n 的结果为 false
#include <iostream>
using namespace std;int main() {int n = 100, m = 200;int *p1 = &(m);return 0;
}

什么样的临时数据会放到寄存器中

寄存器离 CPU 近,并且速度比内存快,将临时数据放到寄存器是为了加快程序运行。但是寄存器的数量是非常有限的,容纳不下较大的数据,所以只能将较小的临时数据放在寄存器中。int、double、bool、char 等基本类型的数据往往不超过 8 个字节,用一两个寄存器就能存储,所以这些类型的临时数据通常会放到寄存器中;而对象、结构体变量是自定义类型的数据,大小不可预测,所以这些类型的临时数据通常会放到内存中。

C++引用不能绑定到临时数据相关推荐

  1. 解决 WPF 绑定集合后数据变动界面却不更新的问题(使用 ObservableCollection)

    解决 WPF 绑定集合后数据变动界面却不更新的问题 独立观察员 2020 年 9 月 9 日 在 .NET Core 3.1 的 WPF 程序中打算用 ListBox 绑定显示一个集合(满足需求即可, ...

  2. 解决 WPF 绑定集合后数据变动界面却不更新的问题

    解决 WPF 绑定集合后数据变动界面却不更新的问题 独立观察员 2020 年 9 月 9 日 在 .NET Core 3.1 的 WPF 程序中打算用 ListBox 绑定显示一个集合(满足需求即可, ...

  3. 引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针

     1.引用内部函数绑定机制 #include<iostream> #include<functional> usingnamespacestd; usingnamespac ...

  4. [WPF 基础知识系列] —— 绑定中的数据校验Vaildation

    [WPF 基础知识系列] -- 绑定中的数据校验Vaildation 原文:[WPF 基础知识系列] -- 绑定中的数据校验Vaildation 前言: 只要是有表单存在,那么就有可能有对数据的校验需 ...

  5. 常亮左值引用可以绑定右值的原因

    相关文章: 为什么常量左值引用可以绑定到右值? 根据该问题的几位答主的回答,整理成个人的理解. 从设计初衷上讲 允许引用绑定非左值的初衷在于"让传值还是传引用成为函数本身的细节,调用者不用去 ...

  6. Spark的临时数据不自动清理

    前言 本文隶属于专栏<Spark异常问题汇总>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见 Spark异常问题汇总 正文 在处 ...

  7. C++ const关键字的总结(全局/局部变量、修饰指针和引用、成员函数和数据成员、修饰类对象、const与宏定义的区别、Static与Const的区别)

    const关键字 const关键字 1.什么是const 2.使用原理 2.1.const全局/局部变量 2.2.cosnt修饰指针和引用 2.3.const修饰函数参数 2.4.const修饰函数返 ...

  8. java bean 绑定,在 Java 应用程序中绑定 Bean 和数据

    将组件绑定到表示数据的 Bean 本节介绍如何将数据绑定到 JTable.JList 和 JComboBox 组件. 将一个数据库表添加到窗体,并自动生成 JTable 以显示数据库表的内容: 打开 ...

  9. repeater用法一步一步详讲,用来绑定和显示数据信息

    估计要分两部: 一部分UI部分:在一个div里面可以写个repeater服务器控件,用来横排显示需要的数据:<asp:Repeater id="" runnat=" ...

最新文章

  1. 【David Silver强化学习公开课】-6:Value Function Approximation
  2. C语言 链表 头插法
  3. Linux中Buffer和Cache的区别
  4. ASP.NET Core 中使用IHttpClientFactory发出HTTP请求
  5. 使用Newtonsoft.Json格式化JSON文档
  6. 华为隐藏功能扩大内存代码大全_发现将华为手机这3个功能打开,竟然可以将手机性能极限发挥...
  7. 广安a货翡翠,自贡a货翡翠
  8. java鼠标右击出现选择窗口_java菜单代码 java中鼠标右击弹出菜单怎样实现
  9. Extjs4循序渐进(一)——开始Ext
  10. 危险无处不在 Html标签带来的安全隐患
  11. CorelDRAWX4的VBA插件开发(九)循环的套用和统一尺寸
  12. 量子通讯加密技术的技术原理
  13. SC-GlowTTS论文阅读
  14. java uint64_Java 中的 uint64
  15. Python之ASCII码相关
  16. 百度短网址URL生成
  17. 【生活记录】松江区驾驶证到期续办(上海)
  18. 机器学习笔试题精选(六)
  19. Windows添加开机和关闭开机启动项
  20. 1219. 黄金矿工

热门文章

  1. day10 局部变量 全局变量 作用域前奏
  2. Linux常用命令——tar
  3. IE下checkbox或radio隐藏bug
  4. nagios安装与配置详解1
  5. 【转载】Android数据库(SqlLite)操作和db文件查看
  6. 本地安装jruby到maven仓库,由于公司网络不给力
  7. PAT甲级1100 Mars Numbers:[C++题解]进制位、使用stringstream类读入
  8. PAT甲级1005 Spell It Right :[C++题解]字符串处理
  9. leetcode 752. 打开转盘锁 c代码
  10. linux下的代码比较工具下载,linux下的代码工具比较