C++中引用的本质分析

C++ 深度解析教程(二)进化后的const分析、布尔类型、引用的本质分析 C++中的const 注意:(为了兼容C语言)C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。 阅读详情

引用是C++中心增加的内容,在C语言是没有引用这一种用法的。那什么是引用呢?

大家都知道,我们定义变量的时候,其实是将变量名和内存空间关联起来,变量名就是一段内存空间的别名。当我们使用引用的时候,例如int& a = b; 其实就相当于a是b的别名,也就是说a和b都是指向同一段存储空间的。那这么做有什么意义呢?

C语言和C++中用引用实现两个数的交换的差别

我们在C语言的时候,当要交换两个变量的值时,很多都是使用指针来实现的,例如下面的代码:

void swap(int* a,int* b)
{
	int t = *a;
	*a = *b;
	*b = t;
}

当我们要调用该函数的时候,我们向该函数传入的是地址,例如swap( &i , &j ); 。
那如果我们在C++中用引用是怎么实现的呢?其实只是将上面的代码进行简单的修改:

void swap(int& a,int& b)
{
	int t = a;
	a = b;
	b = t;
}

对于这个函数的调用,我们就是之间传入变量名就好了,例如:swap( i , j ); 。这样相比于C语言中的传入地址是不是比较直观明了呢?相比于指针的方式更具有可读性和实用性。

const引用

在C++中可以用const声明引用,例如:const int& b = a; 用这样的引用会使得b在程序的执行过程中 无法对其进行复制运算,可以看下下面的代码:

int a = 5;
const int& b = a;
int* p = (int*)&b;
b = 10;		// 错误,b具有只读属性
*P = 15;    // 正确,此时a = b = *p = 15
a = 20;		// 正确,此时a = b = *p = 20

也就是说上面的例子,我们无法通过b改变值,但是可以通过*p和a来改变。这个时候b具有只读的属性。
当使用常量对const引用进行初始化的的时候,C++会为常量值分配存储空间,并将引用名作为这段存储空间的别名。

const int& b = 1;
int* p = (int*)&b;
b = 10;		// 错误,b具有只读属性
*P = 15;    // 正确,此时b = *p = 15

使用常量对const引用进行初始化将会得到一个只读变量。

引用的本质

引用在C++中的内部实现是一个指针常量。例如:int& a,在内部中相当于int * const a。
对于int a = 10;int& b = a;你如果看这两条语句的汇编代码你就会发现,对于int a = 10;C++编译器是将10存进a所代表的存储空间里,对于int& b = a;是将a所代表的内存地址赋给b变量,这是不是跟我们的指针操作一样?其实引用的本质就是指针。
从内部实现上看,C++编译器在编译的时候吧指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。
从使用者的角度看,引用只是一个别名,C++为了实用性而隐藏了引用就是指针这一本质。

总结

引用作为变量别名而存在旨在代替指针,但引用的本质是指针
const引用可以使得变量具有只读属性
引用可以尽可能的避开一些内存错误

深入解析V4L2框架与高通KMD在Camera驱动中的协同设计 本文深入解析了V4L2框架与高通KMD在Camera驱动中的协同设计。V4L2作为Linux内核标准视频驱动框架,提供了统一的设备抽象与数据流管理;而高通KMD则在其基础上,通过引入CRM等核心模块,构建了一套针对移动平台复杂相机系统的高效内核态驱动架构,实现了硬件配置与执行的解耦与智能调度。 阅读详情

相关推荐

海豚调度器(dolphinscheduler)再次使用,添加钉钉预警

1,首先我们部署是海豚调度器 1.3.8版本,由于页面只有邮件预警,所以在了解源码的同时,需要添加钉钉预警 2,说明,这一块是同事搞的,不是我搞的,新版本的dolphinscheduler已经有了钉钉模块,只是新版本还没有发布 3,我们现在只是添加简单的钉钉预警,任务成功或者失败会发送邮件+钉钉 4,具体操作 找到最新的源码devhttps://github1s.com/apache/dolphinscheduler/blob/dev/dolphinscheduler-alert/src/ma...

qq_31866793的博客 3083

C++ 引用的本质是什么?

结论: ①C++中的引用本质上是 一种被限制的指针(类似于线性表和栈,栈是被限制的线性表,底层实现相同,只不过逻辑上的用法不同而已)。 ②由于引用是被限制的指针,所以引用是占据内存的。 ③在使用高级语言的层面上,是没有提供访问引用的方法的。并且引用创建时必需初始化,创建后还不能修改。 下面是找到的相关资料,来证明以上结论。 ************************************************************************************

木牛的博客 3368

可变形卷积(Deformable Conv)原理解析与torch代码实现

图6为可变形卷积示意图。图1所示为普通卷积在输入特征图上进行卷积计算的过程,卷积核大小为3*3,在输入特征图尺寸为7*7上进行卷积,将卷积核权重与输入特征图对应位置元素相乘并求和得到输出特征图元素,按一定方式滑动窗口就能计算得到整张输出特征图。图6所示,在input feature map上普通卷积操作对应卷积采样区域是一个卷积核大小的正方形(绿框),而可变形卷积对应的卷积采样区域为一些蓝框表示的点,这就是可变形卷积与普通卷积的区别。先来一张图感受一下,图3为标准卷积与可变形卷积的卷积示例。

panghuzhenbang的博客 5万+

C++ —— 理解引用及其原理

概念 引用的简单概念: 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 引用一般被使用做参数/返回值这样可以提高效率, 减少拷贝。 底层实现 在语言层面引用是一个对象的别名不占据空间, 但是实际上在底层的实现上引用是类似于指针实现的。 我们借助代码进行探索 int i=5; int &ri=i; ri=8; 通过:调试->窗口->反汇编 int i=5; 00A013DE mov dword

ifwecande的博客 1637

ROS1集群通信的可靠升级方案:为什么在无线环境下我选择了swarm_ros_bridge而非原生DDS

本文探讨了ROS1集群通信在无线环境下的可靠升级方案,重点分析了swarm_ros_bridge相较于原生DDS的优势。通过实际案例和性能对比,展示了ZeroMQ在无线通信中的稳定性和高效性,特别适合无人机编队和移动机器人集群等场景。

weixin_42567279的博客 386

MATLAB安装配置libsvm(附MinGW64配置)

首先声明版本,本人PC系统Windows10 64bit,matlab安装的2016b,libsvm安装的version3.2.21.首先需要下载libsvm包:从林教授的网站上下载: http://www.csie.ntu.edu.tw/~cjlin/libsvm/2.将libsvm3.2.2解压到matlab/toolbox目录下:解压后:D:\matlab2016b\toolbox\libs...

github_35807147的博客 4万+

C++ 引用本质

C++引用及其本质在C++中,引用是一项强大而灵活的特性,允许程序员通过引用访问和修改变量的值。本文将深入探讨C++引用的本质、用法、优势以及与指针的比较等方面。引用是C++中强大而灵活的特性,提供了一种直接而高效的方法来操作变量。通过引用,我们可以避免不必要的拷贝,简化代码结构,提高程序的效率。然而,在使用引用时需要注意生命周期和作用域,确保引用始终指向有效的对象。在适当的场景和使用情境下,引用是C++中不可或缺的一部分。

wuyiyu_的博客 549

《玩儿起来吧》MATLAB 实时图像处理系列(一二三四)

大家学了图像处理之后,是不是就想学以致用。而要用于生活中,最好的方式就是和摄像头搭配,实现实时图像处理。今天就给大家分享MATLAB实时图像处理的基础方法,希望能帮你快速入门。

HPC_ZY 1万+

2020-09-25C++学习笔记引用2:二级指针形参与指针形参的使用方法和区别重难点,主看综合代码(1、指针形参2、引用形参3、二级指针形参4、指针引用形参)

2020-09-25引用2:二级指针形参与指针形参的使用方法和区别重难点 1、指针引用 #include "iostream" using namespace std; struct Teacher { char name[64]; int age; }; int getTe(Teacher **myp ) { Teacher *p = (Teacher *)malloc(sizeof(Teacher)); if (p ==NULL) { return -1; } memset(p

勿在浮沙築高台 493

STM32CubeIDE中文注释变乱码终极解决方案:3步设置永久解决锟斤拷问题!

你是否在STM32CubeIDE中遇到过这样的崩溃场景?——精心编写的中文注释在重新生成代码后变成“锟斤拷”乱码,不仅影响代码可读性,反复修改更是浪费大量时间!作为STM32开发者,我曾被这个问题困扰许久,试过修改软件设置、工程编码却始终治标不治本。直到发现这个基于Java环境变量的终极解决方案,才彻底解决了中文乱码难题。

smart_boy__的博客 2955

别再搞混了!MATLAB通信仿真中EbN0转SNR的保姆级公式推导与避坑指南

本文深入解析MATLAB通信仿真中EbN0与SNR转换的核心公式,揭示数字仿真与理论系统的关键差异。通过真实案例展示错误参数设置导致的隐蔽问题,并提供完整的参数自查清单和正确实现代码,帮助工程师和学生避免常见错误,确保仿真结果准确可靠。

weixin_28746223的博客 348

【C++】引用的本质分析

声明:本文为听课笔记,课程为 https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-16326486319.21.2620ebfcFFOSQa&id=559166901112 (1)引用的意义 1.引用作为变量别名而存在,因此在一些场合可以代替指针 2.引用相对于指针来说具有更好的可读性和使用性 (2)交换函数实现对比 ...

渲染引擎开发 598

OpenHarmony可信执行环境:TEE模块源码分析与实现原理

TEE(Trusted Execution Environment)是OpenHarmony系统中的安全执行环境,用于提供隔离的安全执行环境,保护敏感数据和操作。OpenHarmony的TEE模块基于OpenTrustee实现,采用微内核架构,为系统提供可信执行环境支持。OpenHarmony TEE模块是一个复杂的安全系统,通过提供隔离的执行环境保护敏感数据和操作。

m0_67505153的博客 548

C++引用的本质分析

--事物的难度远远低于对事物的恐惧!     在上一节中我们知道,引用是变量的别名,操作这个别名就相当于操作这个变量,而在C++中,引用更多时候可以在一些场合代替指针,并且相对指针来说,引用具有更好的可读性和实用性。     下边来看看一个老生常谈的交换函数 #include <iostream> using namespace std; //引用方式 void swap1...

年少轻狂,幸福时光 1025

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

深度分析c++引用的本质以及引用与指针的区别

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟另外的内存空间进行存储,它与引用的变量共用的是同一块内存空间的地址。格式如下:类型& 引用变量名(对象名) = 引用实体;而此处的不是取地址操作符,而是起标志作用,标志所定义的标识符是个引用.int a = 1;int& b = a;//此处就是引用的定义return 0;此处就相当于变量a,b共用同一块内存地址空间。

kklovecode的博客 985

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【C++】5.引用的本质分析

引用的意义 引用作为变量的别名而存在,因此在一些场合中可以代替指针 引用相对于指针来说更具有更好的可读性和实用性 swap 函数的对比 // 指针版本 void swap(int *a, int *b) { int t = *a; *a = *b; *b = t } // 引用版本(注意:函数中的引用行参不需要进行初始化!!!) void swap(int&...

zhabin0607的博客 188

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++第5课:引用的本质分析

本文学习自 狄泰软件学院 唐佐林老师的 C++课程 实验1 :可以使用变量和常量初始化 const引用变量, const引用让变量拥有只读属性 注意 :不可以直接用字面常量初始化 引用变量,但是可以初始化 const引用变量 实验2 :引用的本质,是一个指针常量 实验3 :引用的本质,是一个指针常量 实验4:引用的使用-千万不要返回局部变量发引用 注意:引用就是变量本身,内部本质实现是一个指针常...

奶牛养殖场小马 305

c++之引用的本质分析

引用的意义 –引用作为变量别名而存在,因此在一些场合可以代替指针。 –引用相对于指针来说具有更好的可读性和实用性。 swap函数的实现对比:void swap(int& a, int& b) // 这里的a和b已经不是swap函数里的局部变量,它们是外部变量的别名。 { int t = a; a = b; b = t; } Void swap(int* a,int*

鸟宿江边树的博客 498

《C++避坑神器·二》引用的本质分析

(3)申明一个引用不是定义了新的变量,只是目标变量的一个别名,引用本身不是一种数据类型,因此不占存储单元,系统也不会给引用分配存储单元。(5)在被调函数中交换主调函数的两个值,常用方法传递变量地址,第二种就是传递引用。(2)引用变量是目标变量的一个别名,相当于目标变量,只是名字不同。(8)如果函数的返回值是引用,这个函数可以作为左值。(4)对引用求地址,就是对目标变量求地址。(1)申明引用的同时必须要初始化。(6)引用一旦初始化就不可以更改。(7)引用可以作为函数返回值。

cs1395293598的博客 244

【C++学习记录5】引用的本质分析

1)引用是另一个变量的别名,也就是已经存在的一段存储空间的别名; 2)引用作为变量别名而存在,因此在一些场合可以代替指针; 3)引用相对于指针来说具有更好的可读性和实用性。 注意:函数中的引用形参不需要进行初始化,调用的时候初始化。 swap函数的实现对比:   const引用(对常量的引用) 1)在c++中可以声明const引用; 2)const Type & na...

haibing_x的博客 192

C++学习笔记 第5课 引用的本质分析

文章目录1.引用的意义2. 特殊的引用2.1 const引用2.2 特殊的引用3. 引用是否有存储空间4. 引用的本质5. 引用的意义 1.引用的意义 引用作为变量名存在,在一些场合可以代替指针 引用相对于指针有更好的可读性和实用性 比如下面的swap函数进行对比 void swap(int& a,int& b) { int t = a; a = b; b = t; } void swap(int* a,int* b) { int t = a; *a = *b; *b =

weixin_43824344的博客 169

C++深度解析 引用的本质分析 &(4)

C++深度解析 引用的本质分析(4)       引用 是另一个变量的别名(或者是一个已经存在存储空间的别名)。 引用在一些场合可以代替指针。 当引用作为函数的形参时,可以不初始化。 实例程序: #include <stdio.h> void swap(int& a, int& b) { int t = a; a = b; ...

Tim的嵌入式之旅 286
上一篇: C语言和C++中三目运算符的区别
下一篇: C++中函数的默认参数
Mr.LeoLu
博客等级 码龄8年 9粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值