C++:引用

 

目录

概念:

引用的使用格式:

引用特性:

常引用

 使用场景:

1、做参数

二级指针时的取别名 

一级指针取别名

一般函数取别名

2、做返回值

 函数返回值的原理:

引用的返回值使用:

引用和指针的对比: 

 语法层面:

底层:

概念:

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。

int main()
{int a=0;// 引用,b就是a的别名int& b= a;cout <<&b<< endl;cout<< &a<< endl;return 0;
}

如上代码所示,引用符是&,但是要和C语言中的&区分,如上代码就第一个&是c++的,而第二个是C语言的 ,且我们开辟了一个空间,它叫做a ,同时他又叫做b,二者的空间地址都是一样的。

取别名的同时还可以给别名取别名!这就相当于把李逵叫铁牛的同时,又把李逵叫做黑旋风。

int main()
{int a=0;// 引用,b就是a的别名int& b= a;cout <<&b<< endl;cout<< &a<< endl;int& c= a;//给别名取别名,如给别名b取了个别名叫做dint& d= b;return 0;
}

引用的使用格式:

类型& 引用变量名(对象名) = 引用实体;

void TestRef()
{int a = 10;int& ra = a;//<====定义引用类型printf("%p\n", &a);printf("%p\n", &ra);
}

注意:引用类型必须和引用实体是同种类型的。 

引用特性:

  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 引用一旦引用一个实体,再不能引用其他实体 

 最重要的是第三点!第三点通俗来讲就是,当一个空间A取了一个别名X,那么另一个空间B就不能取和A空间相同名字的别名,也就说空间B的别名不能取X。

1、引用必须初始化int& b;//没有初始化,是错误的
b=c;2、引用定义后,不能改变指向int& b= a;
int c=2; 
b=c; //本意是相将c取一个别名,但是这个意思只有赋值的意思,这是常见错误!//且不能同时取一样名字的别名

常引用

关于常引用,当变量的前方加上了const 后,该变量就变成了常量,而对于常量而言,不论是加上了const的变量变成的,还是本身就是一个常量数值,它在引用时必须要加上const ,此外因为引用类型必须和引用实体是同种类型的,但是如果想要跨越类型引用,也必须加上const!

void TestConstRef()
{const int a = 10;//int& ra = a;   // 该语句编译时会出错,a为常量const int& ra = a;// int& b = 10; // 该语句编译时会出错,b为常量const int& b = 10;double d = 12.34;//int& rd = d; // 该语句编译时会出错,类型不同const int& rd = d;
}

 使用场景:

1、做参数

  • 当引用使用在函数的参数上时,引用的用法就和指针一样,指针是因为C语言的形参只是拷贝,所以在传参时需要传递数值的地址,并且需要使用指针来存储地址并指向地址。
  • 而引用是给变量取别名,空间地址是不变的,所以传递参数并且给它取了个别名使用和指针的用法是一样的!

二级指针时的取别名 

//* & phead 是指给传过来的指针取了别名进行下面的函数使用void PushBack(struct Node*& phead,int x)
{phead = newnode;
}int main(){struct Node* plist = NULL;return 0;}

一级指针取别名

void PushBack(struct pNode& phead,int x)
{phead = newnode;
}int main(){pNode plist = NULL;return 0;}

一般函数取别名

void Swap(int& a,int& b)
{//...
}
int main()
{int x=0,y=1;Swap(x,y);return 0;
}

2、做返回值

 函数返回值的原理:

  • 如下图所示,在C语言中,ret 的值是调用了func函数,而func函数会返回一个a,但是按照函数栈帧来讲,mian空间里面开辟了一个空间,而func也开辟了空间。
  • 但是func的空间会随着的调用结束而销毁(作用域的生命周期),同时返回值a也在销毁的地方,所以相当于a销毁了,于是乎ret得到的是个不知道是什么的值。
  • 但是计算机也知道这个东西会这样的结果,所以a就会被计算机传到一个寄存器中,由寄存器保存并交给ret,所以ret拿到的是寄存器的地址和寄存器里面的东西。

引用的返回值使用:

引用的返回值必须使用在全局变量、静态变量、堆上变量否则会出问题。 

静态变量的 返回值的 引用使用方法 
//其中函数的前面是返回值的类型,而这里的返回类型是返回一个别名
//表示着返回了一个变量a的别名 aint& func()
{static int a = 0;return a;
}int main()
{int ret = func();cout << ret << endl;return 0;
}

 如果,返回值并未在上述中的区域出现,且贸然的使用引用,那么根据函数返回值的原理,主函数main 中的变量拿到的这个返回值是已经因为生命周期消失而消失的数值和地址,这个是不成立且得到的数值是随机性的!

就比如下面代码中的ret一样,拿到的并非是寄存器的地址和里面的数值,而是消失的空间地址和里面的数值,就和野指针一样,是一个“野别名”

错误示范!int& func()
{int a = 0;return a;
}int main()
{int ret = func();cout << ret << endl;return 0;
}

引用和指针的对比: 

 语法层面:

  1. 引用是别名,不开空间,指针是地址,需要开空间存地址
  2. 引用必须初始化,指针可以初始化也可以不初始化
  3. 引用不能改变指向,指针可以
  4. 引用相对更安全,没有空引用,但是有空指针,容易出现野指针,但是不容易出现野引用
  5. 在sizeof中含义不同:引用结果为引用类型的大小(如int&、double&等),但指针始终是地址空间所占字节个数(32 位平台下占4个字节)

底层:

  • 汇编层面上,没有引用,都是指针,引用编译后也转换成指针了
  • 在底层代码中,引用其实就是指针,或者说引用会转化为指针并且开辟空间 


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

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

相关文章

HTML — 链接

一. 概述 HTML 使用超链接与网络上的另一个文档相连&#xff0c;可以实现点击即查看另一个文档的内容。HTML 中的链接允许用户在浏览网页时单击文本或图片来跳转到其他位置。 二. HTML 链接&#x1f517; —— 使用标签 HTML 中使用 <a></a> 标签来设置网页中的超…

Java Swing桌面项目打包成可执行jar

前言 最近有需求&#xff0c;将Swing项目打包为一个可执行的jar包&#xff0c;遇见了一些问题&#xff0c;参考AI助手&#xff0c;解决了遇到的问题&#xff0c;也有一些亲身实践体会&#xff0c;记录一下。开发环境IntelliJ IDEA&#xff0c;JDK8&#xff0c;用kotlin语言实现…

navicat连接postgresql、人大金仓等数据库报错

navicat连接postgresql、人大金仓数据库报错问题是一个偶现的问题&#xff0c;需要我们特别关注&#xff1a; 1、客户端连接人大金仓数据库 这里注意&#xff1a;navicat连接postgresql、人大金仓数据库时均选择postgresql类型&#xff0c;因为人大金仓数据库底层和psql数据库…

【第五天】蓝桥杯备战

1、金币 https://www.lanqiao.cn/problems/357/learning/ 解法&#xff1a;暴力 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);//在此输入…

20个经典算法题目和python示例实现(算法编程练手)

以下是20个常见的算法竞赛题目及其解答示例&#xff1a; 1.最大子序列和问题 题目&#xff1a;给定一个整数数组&#xff0c;找到一个具有最大和的连续子数组。 示例解答&#xff1a; def max_subarray_sum(nums):max_sum float(-inf)curr_sum 0for num in nums:curr_sum…

01_Anaconda环境搭建

概述 Anaconda包含了许多常用的科学计算和数据分析的库和工具。通过Anaconda&#xff0c;用户可以更方便地安装、管理和更新这些库和工具&#xff0c;从而提高工作效率。 Anaconda还提供了一个名为conda的包管理器&#xff0c;可以帮助用户方便地安装、管理和更新这些库和工具…

Cartographer学习

官方文档&#xff1a;Compiling Cartographer ROS — Cartographer ROS documentation 动手学ROS2 1、源码安装 git clone https://ghproxy.com/https://github.com/ros2/cartographer.git -b ros2 git clone https://ghproxy.com/https://github.com/ros2/cartographer_ros.g…

写静态页面——魅族声学_前端页面练习

1、效果: 1、html代码: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>魅族声学</titl…

新员工成长-如何自觉学习

自觉学习 前置学习 在工作的前几个月里&#xff0c;你要学习一切如何运作。这将有助于你参与设计讨论、On-Call轮换、解决运维问题和评审代码。OA系统、 代码仓库、版本管理工具、代码评审流程、需求任务拆分系统、软件发布流程、补丁流程、测试流程、周报总结等等&#xff…

c# Microsoft UI Automation

Microsoft UI Automation&#xff08;UIA&#xff09;是一种用于自动化Windows应用程序用户界面&#xff08;UI&#xff09;的框架。它允许开发人员编写自动化测试脚本、辅助技术应用程序和其他需要与应用程序交互的工具。以下是一些关于Microsoft UI Automation的重要信息&…

金智易表通构建学生缴费数据查询+帆软构建缴费大数据报表并整合到微服务

使用金智易表通挂接外部数据,快速建设查询类服务,本次构建学生欠费数据查询,共有3块设计,规划如下: 1、欠费明细查询:学校领导和财务处等部门可查询全校欠费学生明细数据;各二级学院教职工可查询本二级学院欠费学生明细数据。 2、大数据统计报表:从应收总额、欠费总额…

Spring与Redis集成

1.引入RedisTemplate 据以前的情况&#xff0c;我们在Java中使用Redis时一般是使用Jedis来操作的&#xff0c;大致的一段代码如下所示 Overridepublic User findUserById(Integer id) {User user null;Jedis jedis null;try {jedis jedisPool.getResource();String userStr…

直接在GitHub上使用vscode阅读源码

方法&#xff1a; 直接在github后面输入1s即可 效果&#xff1a;

光学系统的核心--分辨率

前言 在机器视觉领域&#xff0c;可以把各个部件划分为光源&#xff0c;镜头&#xff0c;相机&#xff0c;采集卡&#xff0c;算法&#xff0c;运动平台等。各个部件都是系统的有机组合&#xff0c;均有各自的重要性。在实际应用中&#xff0c;成像镜头涉及的光学理论较多&…

[数据结构]-哈希

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习目标&…

适用于烟机变频风机的32位单片机

RAMSUN介绍一款适用于烟机变频风机的32位单片机MM32SPIN0230系列&#xff0c;采用M0内核&#xff0c;最高工作频率可达60MHz&#xff0c;内置32KBFlash和4KBSRAM的存储器&#xff0c;包括1路12位模数转换器ADC&#xff0c;支持11通道&#xff0c;采样速率1Msps&#xff0c;4个通…

智能工厂4G无线设备预测维护云端联动的DI、AI、DO混合信号处理单元

在现代工业智能化进程中&#xff0c;一款集成了丰富I/O接口并能与各大云平台无缝对接的智能设备显得尤为重要。比如最近推出的这款创新产品&#xff0c;它集合了8路数字输入通道&#xff0c;涵盖了干湿节点的识别功能&#xff0c;适用于多种开关量信号的读取&#xff1b;同时&a…

你知道地产神秘顾客调研流程有哪些

在当今竞争激烈的地产市场中&#xff0c;客户满意度是每个地产企业追求的核心目标。为了深入了解客户需求&#xff0c;提升服务质量&#xff0c;神秘顾客调研成为了众多地产企业的得力助手。大家是否了解神秘顾客执行流程呢&#xff1f;一般包括以下几个部分&#xff1a; 在进…

(八)springboot实战——springboot3下的webflux项目全局异常处理

前言 在webflux响应式编程中&#xff0c;如何处理系统运行时异常是本节的主要内容。在传统的Servlet阻塞式web项目中主要通过HandlerExceptionResolver处理器来处理&#xff0c;而在webflux响应式web项目中&#xff0c;则是通过DispatchExceptionHandler异常处理器来处理异常。…

[SWPUCTF 2018]SimplePHP1

打开环境 有查看文件跟上传文件&#xff0c;查看文件里面显示没有文件url貌似可以文件读取 上传文件里面可以上传文件。 先看一下可不可以文件读取 /etc/passwd不能读取&#xff0c;源码提示flag在f1ag.php 看看能不能读取当前的文件&#xff0c; 先把代码摘下来 file.php …