C++ “引用”究竟是什么?(代码实测)

news2025/1/15 16:51:57

        C++的引用是个挺好用的东西,相当于指针的另一种写法,虽然引用有一些约束,比如必须初始化而且不能修改引用目标,但确实非常大地增加了编程的清晰度和灵活性。

        引用主要有这些价值:

  1. 简化指针访问,“.”比“->”少一个字符,而且更容易理解
  2. 使指向指针的指针更容易理解,“int * &”比“int **”容易理解多了
  3. 函数传参和重构灵活,可以通过重新定义参数来轻易地在指针和引用之间转换,避免对整个代码进行“.”和“->”的替换。

        当然,凡事有利就有弊,引用本质是个指针,那么就是两个本质相同的东西拥有不同的表达方式,必然会带来一点混乱。

        比如一个以前是“int”类型的参数,现在被改成了“int &”并且在函数里面修改了值,那么原来的程序会出错,而编译器不会发现任何问题。当然,严格地说,这是函数修改者的错误,这种改变接口的行为的变更是不可以轻易进行的,可是事实却是调用者的代码无辜出错了。

        以上是理论,现在我们用代码看看引用到底是什么:

#include <stdio.h>
#include <typeinfo>

void f(int& x)
{
	printf("-------------------------------\n");
	printf("sizeof(x)         : %2zd : typeid : %s\n", sizeof(x), typeid(x).name());
	printf("%p %d\n", &x, x);
}
void f2(int* x)
{
	printf("-------------------------------\n");
	printf("sizeof(x)         : %2zd : typeid : %s\n", sizeof(x), typeid(x).name());
	printf("%p %p\n", &x, x);
}
int main()
{
	int a = 111;
	printf("a   %p %d\n", &a, a);
	int& r_a = a;
	printf("r_a %p %d\n", &r_a, r_a);
	int* p_a = &a;
	printf("p_a %p %p\n", &p_a, p_a);
	
	f(a);
	f(r_a);
    f(*p_a);
	f2(&a);
	f2(&r_a);
	f2(p_a);
	return 0;
}

        这是VS2022的64位C++控制台程序代码(debug版),在main函数任何一处设置断点,调试运行,在程序运行到断点处停下来之后,打开反汇编窗口,看看反汇编代码的样子:

        两个红色方框出的代码分别是给引用和指针赋值,即使完全不懂汇编也能看出来——毫无区别。

        下面是调用"f(int&x)"的反汇编代码:

        “f(r_a)”和“f(*p_a)”的汇编代码相同是能看出来的。

        下面是调用“f2(int* x)”的反汇编代码:

        看得出来,跟前面的一样啊,这就很明白了,“引用”其实就是“指针”,不过语法上被当作“别名”,我们看一下这个程序的输出:

        红线指向的就是“f(int &x)”的参数类型,分明写着“int”啊,所以“引用”在语法层面是“别名”,内部实现为指针。

(这里是结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1104806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简单方法建立个人网站,不用编程

对于很多没有编程知识的小白来说&#xff0c;建立个人网站似乎是一件困难而遥远的事情。然而&#xff0c;现在有了一个无需编程的方法&#xff0c;小白也能够轻松建立自己的个人网站&#xff0c;让自己的才华和创意得到更好的展示&#xff01; 首先&#xff0c;你需要登录乔拓云…

【快刊推荐】综合类EI,最新案例29天录用,国人友好!

综合类 • 快刊推荐 01 期刊简介 检索数据库&#xff1a;EI &Scopus &Google Scholar 版面类别&#xff1a;正刊 数据库收录年份&#xff1a;2009年 国人占比&#xff1a;47%&#xff0c;对国人友好 年发文量&#xff1a;20篇左右 02 接收领域 生物&#xff…

常见场景面试题-接口重试策略、二维码扫描原理、幂等性、排行榜(三)

typora-copy-images-to: imgs微信二维码扫描原理&#xff1a; 答&#xff1a;流程&#xff1a; 总的来说&#xff0c;PC 端需要进行扫码登陆的原理是通过二维码绑定移动端的身份信息以及PC端的设备信息&#xff0c;根据这两个信息生成 token 给 PC 端&#xff0c;PC 端就登陆成…

重建大师如何调用GPU?

答&#xff1a;会调用GPU的cuda和显存&#xff0c;不同处理的阶段&#xff0c;占用会不一样。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0c;输入倾斜照片&#xff0c;激光点云&#xff0c;POS信息及像控点&#xff0c;输出高精度彩色网格模…

Dreamweaver2019安装教程从零基础入门到精通(非常详细附安装包)看完这一篇就够了

软件介绍 Dreamweaver简称“DW”&#xff0c;是一款专业的网页设计软件&#xff0c;集网页制作和网站管理于一身的即时检索的网页代码编辑器&#xff0c;利用对 HTML、CSS、JavaScript 等内容的支持&#xff0c;设计人员和开发人员可以在几乎任何地方快速制作并发布网页。借助…

Vue小案例(一)

目录 案例一&#xff1a;点击按钮切换图片 案例二&#xff1a;书架 案例三&#xff1a;成绩表 案例一&#xff1a;点击按钮切换图片 现在有5张图片&#xff0c;我想通过点击上一张 / 下一张的按钮来进行图片切换。 使用&#xff1a;v-bind、v-on、v-show 1、首先创建好Vu…

使用FreeMarker导出word文档(支持循环导出实时多张图片)

续上一期的更新内容 &#xff0c;导出的是单张图片&#xff0c;直接在路径的src 里面填写对应的占位符&#xff0c;就可以了&#xff0c;随着需求的变化&#xff0c;那么今天我们继续往下写一个循环导出多张图片到word里面。 使用FreeMarker导出word文档(支持导出单张图片) …

如何评估大语言模型是否可信?这里总结了七大维度

源自&#xff1a;机器之心发布 作者&#xff1a;刘扬&#xff0c;Kevin Yao 实际部署中&#xff0c;如何 “对齐”&#xff08;alignment&#xff09;大型语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;&#xff0c;即让模型行为与人类意图相一致…

荣耀推送服务业务介绍

概述 荣耀推送服务&#xff08;HONOR Push&#xff09;是荣耀公司向开发者提供的消息推送服务&#xff0c;通过服务端与客户端建立一条稳定、可靠的长连接通道&#xff0c;向荣耀手机系统上的APP应用客户端实时推送消息的服务。无论应用进程是否存在&#xff0c;均可正常收到消…

【AIFEM案例教程】水轮机活动导叶强度分析

AIFEM是由天洑自主研发的一款通用的智能结构仿真软件&#xff0c;助力用户解决固体结构相关的静力学、动力学、振动、热力学等实际工程问题&#xff0c;软件提供高效的前后处理工具和高精度的有限元求解器&#xff0c;帮助用户快速、深入地评估结构的力学性能&#xff0c;加速产…

LAS Spark+云原生:数据分析全新解决方案

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 随着数据规模的迅速增长和数据处理需求的不断演进&#xff0c;云原生架构和湖仓分析成为了现代数据处理的重要趋势。在这个数字化时代&#xff0c;企业面临着海量数…

leetcode:101.对称二叉树

借用二叉树是否相同的代码改动左右孩子相等对应关系&#xff0c;即为是否对称。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/bool isSameTree(struct TreeNode* p, struct Tr…

纳米软件科普|什么是运放芯片?运放芯片测试方法是什么?

运放芯片是一种电路元件&#xff0c;它可以用于信号放大、滤波、积分、微分等电路中。在多媒体音箱领域&#xff0c;运放芯片主要负责音量、音调和周边效果调节的运算功能。例如&#xff0c;音响中的前级和耳机放大器(耳放)中都会使用集成运算放大器。常见的运放芯片有OPA1612和…

nvm 安装 node 安装不上 npm

遇到一个问题 nvm install 18.18.2 node -v 安装上了 npm -v 发现没有安装上 解决办法 nvm -v 查看到自己的 nvm 版本号是 1.1.7 NVM下载 - NVM中文网 下载最新版本的 nvm .exe 文件 nvm list 查看手里 node 的所有版本 nvm uninstall 各个版本只保留一个最低版本 点…

中文编程开发语言工具编程案例:计时计费管理系统软件连接灯控器编程案例

中文编程开发语言工具编程案例&#xff1a;计时计费管理系统软件连接灯控器编程案例 中文编程开发语言工具编程案例&#xff1a;计时计费管理系统软件连接灯控器编程案例 中文编程系统化教程&#xff0c;不需英语基础。学习链接 https://edu.csdn.net/course/detail/39036

Messari发布Moonbeam简报,每日交易量稳步增长,首次公布利润数据

区块链数据公司Messari首次发布Moonbeam项目分析简报&#xff0c;从项目市值、链上数据表现、质押以及Moonbeam的技术优势XCM使用量等角度全面分析。这个再熊市初期上线的项目一直在默默开发&#xff0c;并在跨链互操作领域拥有了相当的实操成绩。我们翻译了Messari简报中的部分…

分类预测 | Matlab实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆神经网络的数据多输入分类预测

分类预测 | Matlab实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆神经网络的数据多输入分类预测 目录 分类预测 | Matlab实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆神经网络的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-BiLSTM鲸鱼算法…

AirPods Max奇特的关机模式!如何关闭AirPods Max

对于一家专注于让事情变得更简单的公司来说&#xff0c;苹果已经把关闭最高端耳机这样的基本问题过于复杂了。耳机没有电源按钮。别担心&#xff1b;如果你想弄清楚情况&#xff0c;你并不孤单。今天&#xff0c;我们将教你如何关闭AirPods Max。 如何关闭AirPods Max AirPods…

万界星空科技离散型制造企业MES解决方案

MES即制造企业生产过程执行系统,面向制造企业车间执行层的生产信息化管理系统。是精益生产、数字化工厂、智慧工厂的支撑平台。帮助企业对生产全流程进行管控并进行信息追溯,实现柔性化生产、精细化管理。 一、企业生产场景总览: 二、MES系统架构图: 帮助企业实现制造执行自动…

QT的QStringList的使用

初始 化 默认构造函数创建一个空列表。可以使用初始值设定项列表构造函数创建包含元素的列表&#xff1a; QStringList fonts { "Arial", "Helvetica", "Times" }; 添加字符串 可以使用insert 、append&#xff08;&#xff09; 和 operator…