C++--引用


一.引用的定义🍗

引用是已定义的变量的别名。
例如将data作为value的引用(别名),则可以随意使用data或value来表示该变量。
引用有何作用呢? 其主要作用是作为函数的形参(和函数的返回值)。这样 函数的形参就是实参本身,而不是其副本。这样除指针外,引用也为函数处理大型结构提供了一种非常方便的途径,同时对于设计类来说,引用也是必不可少的。

1.创建引用变量🍗

类型名 & 引用变量名 = 被引用的变量名;

int main()
{
	int a = 100;
	int& b = a;//b是a的引用
	cout << "a=" << a << ",b=" << b << endl;
	++a;
	cout << "a=" << a << ",b=" << b << endl;
	++b;
	cout << "a=" << a << ",b=" << b << endl;

	//输出两个变量的地址
	cout << "&a=" << &a << ",&b=" << &b << endl;

	return 0;
}


2.&的含义🍗

含义1:作为取地址符号,例如int a=10; int*p=&a; 这里的&是取地址的意思
含义2:作为引用符号,例如int a=10 int &b=a; 这里的&是引用的意思
int a = 10;
cout<<&a<<endl;//&表示取地址符
int &b = a; //&表示引用

这两个怎么区分呢?

定义语句(前面有数据类型)中&表示引用;在使用语句(前面没有数据类型)中&表示取地址符。

//&:取地址符和引用的区别
int main()
{
	int a = 10;
	int b = 20;
	int* p = &a;//&取地址符, a的前面没有类型
	int& b = a;// &引用 ,b的前面有类型
	int* q = p;//指针赋值
	int* & p1 = p;//&引用,p1是p的引用
	int** q2 = &p;//&取地址符,p的前面没有类型

	return 0;
}

​​​​​​ 第9行int *& p1 = p;比较复杂,因为p的类型是int *,所以它的引用应该是int * &。

对于C语言用户而言,首次接触到引用时可能也会有些困惑,因为你很自然地会想到指针,但它们之间还是有区别的。例如,可以创建指向a的引用和指针:

int &b = a;//引用,b是a的别名
int *p = &a;//指针,p保存a的地址

这样,表达式b和*p都可以表示a,而表达式&b和p都可以表示&a。从这一点来说,引用看上去很像伪装的指针(其中,*解引用运算符被隐藏)。实际上,引用除了和指针表示法不同外,还有其它的区别。
指针和引用区别:1.引用在定义时必须将其初始化,而指针可以先定义,再赋值。


int c = 10;
int &d;//错误,引用在定义时必须初始化
d = c;
int *p;//合法,定义指针不初始化
p = &c;//合法,给指针赋值

注意: 引用在定义时必须进行初始化
指针和引用区别:2.引用更接近const指针,一旦与某个变量关联起来,就将一直效忠于它,不能再作为别的变量的引用。也就是说:

int &b = a;

实际上和下述代码的效果类似:

int *const p = &a;

其中,引用b扮演的角色和*p相同。
下面的代码,试图将a变量的引用,改为b变量的引用,将发生什么呢?
 

int main()
{
	int a = 10;
	int b = 20;
	int& c = a;  //c是a的引用
	cout << "a=" << a << ",c=" << c << endl; //输出a,c的值
	cout << "&a=" << &a << ",&c=" << &c << endl;//输出a,c的地址
	cout << endl;

	c = b; //试图将c修改为b的引用,c有没有引用b呢?
	cout << "b=" << b << ",c=" << c << endl;//输出b,c的值
	cout << "&b=" << &b << ",&c=" << &c << endl;//输出b,c的地址
	cout << endl;

	c = 50;  //修改引用的值
	cout << "a=" << a << ",b="<<b<<",c=" << c << endl;//输出a,b,c的值
	cout << "&a="<<&a<<",&b=" << &b << ",&c=" << &c << endl;//输出a,b,c的地址
	return 0;
}


二.将引用作为函数参数🍗

引用经常被用作函数参数,使得函数中的形参为调用程序中实参的别名。这种传递参数的方法称为按引用传递。C++新增这项特性是对C语言的超越,C语言只能按值传递或按指针传递。按值传递导致形参使用的仅仅是实参的副本,下面通过交换函数来进行演示:
//按值传递,形参只是实参的副本,不能达到交换值的效果
void Swapv(int x, int y)//错误的
{
	int tmp = x;
	x = y;
	y = tmp;
}

//按指针传递,可以实现两个数的交换
void Swapp(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

//按引用传递
void Swapr(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int a = 10, b = 20;//创建三组需要交换的变量
	int c = 10, d = 20;
	int e = 10, f = 20;
	cout << "按值传递,交换前:" << a << "," << b << endl;
	Swapv(a,b);
	cout << "按值传递,交换后:" << a << "," << b << endl;
	cout << endl;//输出空行

	cout << "按指针传递,交换前:" << c << "," << d << endl;
	Swapp(&c, &d);
	cout << "按指针传递,交换后:" << c << "," << d << endl;
	cout << endl;//输出空行

	cout << "按引用传递,交换前:" << e << "," << f << endl;
	Swapr(e, f);
	cout << "按引用传递,交换后:" << e << "," << f<< endl;

	return 0;
}


三.指针与引用的区别🍗

1.从语法规则上讲,指针变量存储某个实例(变量或对象)的地址;引用是某个实例的别名。
2.程序为指针变量分配内存;而不为引用分配内存。
3.指针变量的值可以发生改变,存储不同实例的地址;引用在定义时就被初始化,之后无法改变(不能是其他对象的引用)。
4.指针变量的值可以为空(NULL,nullptr),但引用不能为空,没有空引用。
5.指针变量作为形参时需要测试它的合法性(判空NULL);引用不需要判空(引用不能为NULL);

创作不易,如果喜欢的化给个赞以表支持吧!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

命名空间 “Eigen“ 没有成员 “SelfAdjointEigenSolver“

代码中用到SelfAdjointEigenSolver 结果报错&#xff1a;报错实在windows10条件下发生的。 查找资料&#xff0c;最后还是要定位到官方文档。 计算自伴随矩阵的特征值和特征向量。 这是在特征值模块中定义的。 添加如下引用即可解决&#xff0c;请点赞关注。 #include <…

ssm+vue的物流配送人员车辆调度管理系统的设计与实现(有报告)。Javaee项目,ssm vue前后端分离项项目。

演示视频&#xff1a; ssmvue的物流配送人员车辆调度管理系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&…

腾讯云服务器定价_云服务器价格_云服务器计费模式

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

一文搞懂系列——Linux C线程池技术

背景 最近在走读诊断项目代码时&#xff0c;发现其用到了线程池技术&#xff0c;感觉耳目一新。以前基本只是听过线程池&#xff0c;但是并没有实际应用。对它有一丝的好奇&#xff0c;于是趁这个机会深入了解一下线程池的实现原理。 线程池的优点 线程池出现的背景&#xf…

腾讯云服务器购买指南,2024更新购买步骤

腾讯云服务器购买流程很简单&#xff0c;有两种购买方式&#xff0c;直接在官方活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动…

2024年学鸿蒙开发就业前景怎么样?

随着科技的不断进步&#xff0c;鸿蒙系统作为华为自主研发的操作系统&#xff0c;逐渐引起了人们的关注。 2024年&#xff0c;鸿蒙开发就业前景如何&#xff1f; 对于那些对鸿蒙开发感兴趣并希望在这一领域寻找职业发展的人来说&#xff0c;这是一个非常重要的问题。 首先&a…

buuctf-Misc 题目解答分解118-120

118.[INSHack2017]sanity 打开压缩包就是一个md 文件 typora 打开 发现flag INSA{Youre_sane_Good_for_you} 119.粽子的来历 解压压缩包 &#xff0c;得到文件夹如下 用010 editor 打开 我是A.doc 这个有些可以 都改成FF 保存 然后再次打开 docx 文件就发现了屈原的诗 其他b…

PattPatel-“Introduction to Computing Systems“(4)期末样卷题目解析:C语言递归

C语言的递归我觉得最主要的还是要把Patt&Patel的部分好好理解下&#xff08;因为有和硬件结合的部分&#xff09;&#xff0c;但因为今天就考试&#xff08;来不及做这样的事情&#xff09;&#xff0c;先把之前模拟卷的题目给尝试弄明白&#xff0c;然后考完试之后继续学习…

《新课程教学》(电子版)是正规期刊吗?能评职称吗?

《新课程教学》&#xff08;电子版&#xff09;主要出版内容为学科教学理论、学科教学实践经验和成果&#xff0c;主要读者对象为中小学教师&#xff0c;期刊设卷首语、名家讲堂、课程与教学、教学实践、考试评价、教育信息化、教学琐谈、教育管理、教师心语、一线课堂、重温经…

StarRocks Awards 2023 年度贡献人物

2023 年行将结束。这一年&#xff0c;StarRocks 继续全方位大步向前迈进&#xff0c;在 300 贡献者的辛勤建设下&#xff0c;社区先后发布了 50 版本&#xff0c;并完成了从全场景 OLAP 到云原生湖仓的进化。 贡献者们的每一行代码、每一场布道&#xff0c;推动着 StarRocks 社…

c语言学习总结———编译和链接

再次来做一下学习总结&#xff0c;今天我们总结一下关于编译和链接的学习吧&#xff01; 1. 翻译环境和运⾏环境 在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执⾏的机器指令。 第2种是执⾏环境&…

Matter - 体验,灯泡(1)

一、前言 Matter&#xff08;当时称为 Project Connected Home over IP 或 Project CHIP&#xff09;于2019年12月11日首次宣布。当时&#xff0c;它是由苹果、谷歌、亚马逊和联发科技等公司共同发起的一个项目&#xff0c;目的是创建一个开放标准&#xff0c;提高智能家居设备…

模拟日光AR汽车HUD的光学特性太阳光模拟器

AR HUD 的光学特性 几何光学可描述物体、透镜和成像之间的关系。将物体放在透镜及其焦点之间将会形成放大且离实际物体有一定距离的虚像[4]。这便是 HUD 生成虚像的方法。源物体&#xff08;在这里是散射屏或 TFT 面板&#xff09;在 HUD 反光镜光学系统的焦距内。这使相应虚像…

快速排序【hoare版本】【挖坑法】【双指针法】(数据结构)

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中 的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右子序列中所有元素均…

第五站:C++的内存解析

目录 C内存分布 变量的四种存储方式 函数返回值使用指针(指针函数) 动态分配内存空间 不能使用外部函数的普通局部变量的地址 通过指针函数返回静态局部变量的地址 动态内存 根据需要分配内存,不浪费(根据用户的需求设置内存的容量) 被调用函数之外需要使用被调用函数内…

C# Cad2016二次开发选择文本信息导出(六)

//选文本信息导出 [CommandMethod("getdata")] public void getdata() {// 获取当前文档和数据库Document doc Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;Database db doc.Database;Editor ed doc.Editor;// 获取当前…

亲手打造一个本地LLM语音助手来管理智能家居

经历过 Siri 和 Google 助手之后&#xff0c;我发现尽管它们能够控制各种设备&#xff0c;但却无法进行个性化定制&#xff0c;并且不可避免地依赖于云服务。出于对新知识的渴望以及想在生活中使用一些酷炫的东西&#xff0c;我下定决心&#xff0c;要追求更高的目标。我的要求…

我成为开源贡献者的原因竟然是做MySql-CDC数据同步

今年下半年机缘巧合下公司决定搭建自己的数据中台&#xff0c;中台的建设势必少不了数据集成。首先面临的就是数据集成技术选型的问题&#xff0c;按照社区活跃度、数据源适配性、同步效率等要求对市面上几个成熟度较高的开源引擎进行了深度调研。 最终经过内部讨论决定用Apac…

解决虚拟机字体太小的问题

在win11中&#xff0c;安装VMWare软件后&#xff0c;创建好虚拟机&#xff0c;打开终端后&#xff0c;发现终端里显示的字体太小&#xff0c;不方便使用&#xff0c;因此需要修改。 1、打开终端 2、输入"gsettings set org.gnome.desktop.interface text-scaling-factor…

运筹说 第98期|无约束极值问题

上一期我们一起学习了关于非线性规划问题的一维搜索方法的相关内容&#xff0c;本期小编将带大家学习非线性规划的无约束极值问题。 下面&#xff0c;让我们从实际问题出发&#xff0c;学习无约束极值问题吧&#xff01; 一、问题描述及求解原理 1 无约束极值问题的定义 无约…