C++ 引用(别名)

news2024/11/26 3:44:41
1.引用变量的定义:

类型&引用变量名称=变量名称;
&和类型结合称之为引用符号,不是取地址符,而是代表别名的意思。

#include<iostream>
using namespace std;
int main()
{
	int a = 10; //定义一个整型变量a并初始化为10
	int b = a; //定义一个整型变量b并将a赋值给b,相当于把10赋值给b
	int& c = a; //定义一个引用变量c,c作为a的别名,所以c的值也就是a的值10
	cout << "a=" << a << " b=" << b << " c=" << c << endl;
	return 0;
}

在这里插入图片描述

2.引用的特点:

(1)定义引用必须初始化
(2)不存在空引用
(3)不存在二级引用
在这里插入图片描述
在这里插入图片描述

3. const 引用:
#include<iostream>
using namespace std;
int main()
{
	int a = 10;
	const int b = 20;
	int& x = b;//error x引用b,b只有可读权限,x可读可写,权限放大,不允许
	const int& x = b; // 权限平移,允许
	const int& y = a; //y引用a,权限缩小,允许
	const int& z = 10;//z引用10,权限缩小,允许
	return 0;
}

在这里插入图片描述

4. 引用作为形参替代指针:

使用指针交换两个整型值:

void zz_swap(int* a, int* b)
{
	assert(a != NULL && b != NULL);
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
int main()
{
	int x = 10,y = 20;
	cout << "x=" << x << " y=" << y << endl;
    zz_swap(&x, &y);
	cout << "x=" << x << " y=" << y << endl;
	return 0;
}

使用引用交换两个整型值:

void yy_swap(int& a, int& b)//不存在空引用,不需要判空,比指针安全
{
	int tmp = a;
	a = b;
	b = tmp;
}
int main()
{
	int x = 10,y = 20;
	cout << "x=" << x << " y=" << y << endl;
	yy_swap(x, y);
	cout << "x=" << x << " y=" << y << endl;
	return 0;
}

在这里插入图片描述

5. 其他引用:
#include<iostream>
using namespace std;
int main()
{
	int a = 10, b = 20;
	int ar[5] = { 1,2,3,4,5 };
	int* p = &a;
	int*& rp = p; //引用指针
	int& x = ar[0];
	int(&br)[5] = ar;//引用数组	
	cout <<"*p=" << *p << endl;
	cout <<"*rp="<< * rp << endl;
	cout << "x="<<x << endl;
	cout << "br=";
	for (int i = 0; i < 5; i++)
	{
		cout<<br[i] << " ";
	}
	return 0;
}

在这里插入图片描述

指针和引用的区别:

从语法规则上讲,指针变量存储某个实例(变量或对象)的地址;引用是某个实例的别名。
程序为指针变量分配内存区域;而不为引用分配内存区域。
解引用是指针使用时要在前加“*”;引用可以直接使用。
指针变量的值可以发生改变,存储不同实例的地址;引用在定义时就被初始化,之后无法改变(不能是其他实例的引用)。
指针变量的值可以为空(NULLnullptr);没有空引用。
指针变量作为形参时需要测试它的合法性(判空NULL);引用不需要判空;
对指针变量使用“sizeof"得到的是指针变量的大小。对引用变量使用“sizeof"得到的是变量的大小。
理论上指针的级数没有限制;但引用只有一级。即不存在引用的引用,但可以有指针的指针。
++引用与++指针的效果不一样。例如就++操作而言,
对指针变量的操作,会使指针变量指向下一个实体(变量或对象)的地址;而不是改变所指实体(变量或对象)的内容。
对引用的操作直接反应到所引用的实体(变量或对象)。
不可以对函数中的局部变量或对象以引用或指针方式返回。
以下代码都是错误的:

int*fun1()
{
	int a=10;
	return a;
}
int&fun2()
{
	int a=10;
	return a;
}

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

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

相关文章

Java 实现提取富文本中包含特定字符串的图片 src 属性值

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

数据库触发器简介——修改数据的触发器、删除数据的触发器

1.修改数据的触发器 修改数据的触发器 create trigger tb_user_update_triggerafter update on tb_user for each row begininsert int user_logs(id,operation,operate_time,operate_id,operate_params)VALUES(null,update,now(),new.id,concat(更新之前的数据&#xff1a;i…

2023年的深度学习入门指南(20) - LLaMA 2模型解析

2023年的深度学习入门指南(20) - LLaMA 2模型解析 上一节我们把LLaMA 2的生成过程以及封装的过程的代码简单介绍了下。还差LLaMA 2的模型部分没有介绍。这一节我们就来介绍下LLaMA 2的模型部分。 这一部分需要一些深度神经网络的基础知识&#xff0c;不懂的话不用着急&#xf…

工厂方法模式——多态工厂的实现

1、简介 1.1、概述 在工厂方法模式中&#xff0c;不再提供一个统一的工厂类来创建所有的产品对象&#xff0c;而是针对不同的产品提供不同的工厂&#xff0c;系统提供一个与产品等级结构对应的工厂等级结构。 1.2、定义 工厂方法模式&#xff08;Factory Method Pattern&am…

与 ChatGPT 进行有效交互的几种策略

在这篇文章中&#xff0c;您将了解即时工程。尤其&#xff0c; 如何在提示中提供对响应影响最大的信息什么是角色、正面和负面提示、零样本提示等如何迭代使用提示来利用 ChatGPT 的对话性质 废话不多说直接开始吧&#xff01;&#xff01;&#xff01; 提示原则 快速工程是有…

跃焱邵隼网站demo

xdm 网站的代码开源了。 今年迷上摄影和剪辑了&#xff0c;所以很少投入到网站的维护。 然后经过群友的一些反馈&#xff0c;所以决定 将网站上demo开源放出来了。 后面有机会再出一些好玩的东西。 哦 对了 3d 编辑器我已经融入地图了 年底搞一些好玩的东西出来。 可以关注…

常用的镜像命令

docker images 列出本地主机上的镜像 各个选项说明: REPOSITORY&#xff1a;表示镜像的仓库源 TAG&#xff1a;镜像的标签版本号 IMAGE ID&#xff1a;镜像ID CREATED&#xff1a;镜像创建时间 SIZE&#xff1a;镜像大小 同一仓库源可以有多个 TAG版本&#xff0c;代表这个仓…

EtherNet/IP转 Modbus网关实现AB PLC控制变频器案例

捷米特JM-EIP-RTU网关 Modbus转ETHERNET/IP用于将多个变频器连接到Ethernet/Ip主网&#xff0c;以便森兰变频器可以由AB PLC控制。 配备专用于JM-EIP-RTU网关的EDS文件&#xff0c;AB PLC主站可以控制森兰逆变器从站。 使用 AB 系统的配置方法 1&#xff0c; 运行 RSLogix 500…

复习之linux存储的基本管理

一、实验环境的设定 1. 实验环境的搭建 本节内容只需要一台虚拟机 westosa reset重置虚拟机&#xff0c;保证实验环境的纯净配置网络实现ssh连接 重置虚拟机后&#xff0c;配置网络&#xff0c;设定ip&#xff1a;172.25.254.100&#xff0c;保证与主机可以通信 实现ssh连接…

代码随想录day13 | 226.翻转二叉树 101.对称二叉树

文章目录 一、翻转二叉树二、对称二叉树 一、翻转二叉树 使用前、后序反转最为方便。 // 使用递归三部曲 class Solution { public:TreeNode *dfs(TreeNode *root){// 前序反转if (root nullptr)return root;swap(root->left, root->right);dfs(root->left);dfs(ro…

三子棋(超详解+完整码源)

三子棋 前言一&#xff0c;游戏规则二&#xff0c;所需文件三&#xff0c;创建菜单四&#xff0c;游戏核心内容实现1.棋盘初始化1.棋盘展示3.玩家下棋4.电脑下棋5.游戏胜负判断6.game&#xff08;&#xff09;函数内部具体实现 四&#xff0c;游戏运行实操 前言 C语言实现三子棋…

TEE GP(Global Platform)认证规范

TEE之GP(Global Platform)认证汇总 一、GP认证规范库 二、TEE GP认证规范文档 如果需要TEE对应的GP认证规范文档&#xff0c;请按照下方选择框选择TEE&#xff0c;然后Search&#xff0c;共查询到31个相关规范文档。 参考&#xff1a; GlobalPlatform Certification - Global…

利用python实现自增填充和脚本批量解压文件

和学弟整理学校档案 因为这个方法只用了一下午就干完了 净赚&#xffe5;300 写文章记录一下 需求分析 我要储存很多个文件(几万个文件) 而且要按照文件的顺序进行排序的编号 目的是解放一下双手只用简单的ctrl cv实现命名的自增 如果没有库的话就pip install 库名 import t…

第一启富金:美联储决议及讲话来袭、黄金不改趋势性看涨前景

第一启富金基本面分析&#xff1a; 中国纸黄金交易通显示&#xff0c;全球最大黄金上市交易基金(ETF)截至07月22日持仓量为919.00吨&#xff0c;较上日增持5.20吨&#xff0c;本月止净减持2.90吨。 周二美国公布的7月消费者信心指数为117&#xff0c;远高于预期的111.8&#xf…

Docker Compose介绍及部署

Docker Compose介绍及部署 一、Docker Compose介绍&#xff1a;1、Compose简介2. YAML 文件格式及编写注意事项3. YAML数据结构 二、Docker Compose部署1、 Docker Compose 环境安装2.、Docker Compose配置常用字段3、Docker Compose 常用命令4、Docker Compose 文件结构编写配…

第五章:通过对抗擦除的目标区域挖掘:一种简单的语义分割方法

0.摘要 我们研究了一种逐步挖掘具有鉴别性的物体区域的原则方法&#xff0c;使用分类网络来解决弱监督语义分割问题。分类网络只对感兴趣对象中的小而稀疏的鉴别性区域有响应&#xff0c;这与分割任务的要求相背离&#xff0c;分割任务需要定位密集、内部和完整的区域以进行像素…

C#——多线程之Task

C#——多线程之Task 前言一、Task是什么&#xff1f;二、各应用场景以及实例分析1.异步执行代码2.等待异步操作完成3.并行执行多个任务4.处理异常5.取消异步操作 三、一些其他问题1.WhenAll与WhenAny的区别 总结 前言 在代码编写过程中&#xff0c;经常会用到多线程的知识&…

Vue如何配置eslint

eslint官网: eslint.bootcss.com eslicate如何配置 1、选择新的配置&#xff1a; 2、选择三个必选项 3、再选择Css预处理器 4、之后选择处理器 5、选择是提交的时候就进行保存模式 6、放到独立的配置文件上去 7、最后一句是将自己的数据存为预设 8、配合console不要出现的规则…

每天一道C语言编程(2^k进制数)

题目描述 设r是个2^k 进制数&#xff0c;并满足以下条件&#xff1a; &#xff08;1&#xff09;r至少是个2位的2^k 进制数。 &#xff08;2&#xff09;作为2^k 进制数&#xff0c;除最后一位外&#xff0c;r的每一位严格小于它右边相邻的那一位。 &#xff08;3&#xff09;…

NoSQL之 Redis 部署,配置与优化

文章目录 NoSQL之 Redis配置与优化一.关系数据库与非关系型数据库1.关系型数据库2.非关系型数据库3.关系型数据库和非关系型数据库区别4.非关系型数据库产生背景 二.Redis简介1.了解Redis2.Redis 具有以下几个优点3.Redis为何这么快 三.Redis 安装及应用1.Redis 安装部署2.Redi…