【C/C++】引用()的概念和用法

news2025/2/4 3:59:33

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

  • 一、概念
  • 二、函数值传递、地址传递、引用传递的比较
  • 三、引用与指针的区别
  • 总结
    • 注意事项

一、概念

引用就是对一块已存在的空间(变量)起了一个别名!!!能够简化程序编写优化内存使用提高程序效率

定义引用的符号:&

	char a = 'V';
	char& b = a;

和取地址符长得相同,在上面的用法中是定义了一个引用而非取地址的意思。

定义了引用就要初始化,不存在空的引用!

int main()
{
	// &不是取地址 定义引用
	char a = 'V';
	char& b = a;
	//int& c;   error:定义了就要初始化,不存在空的引用
	const int& d = 10;	//常量也可以引用常量
	cout << a << "  " << b << endl;
	return 0;
}

输出字符a和a的引用b,输出结果相同,引用只是起了一个别名!!

引用 与 原变量 指向 同一块内存空间,对 引用 操作就是对 原变量 进行操作

(改变a的值,引用b也会随之改变)

在这里插入图片描述

二、函数值传递、地址传递、引用传递的比较

三种传参方式:- 值传递 - 地址传递 - 引用传递

分别使用值传递地址传递引用传递创建三个函数,它们构成函数重载

void fun10(char c)
{
	cout << __FUNCSIG__ << endl;
	c = 'z';
}
void fun10(char *c)
{
	cout << __FUNCSIG__ << endl;
	*c = 't';
}
void fun10(char &c)
{
	cout << __FUNCSIG__ << endl;
	c = 'x';
}

在主函数中分别调用这三个函数:

int main()
{
	char a = 'V';
	char& b = a;
	//值传递
	{
		void fun10(char c);			//函数局部声明
		fun10(a);
		cout << a << "  " << b << endl;
	}
	//地址传递
	fun10(&a);
	cout << a << "  " << b << endl;
	//引用传递
	{
		void fun10(char& c);		//函数局部声明
		fun10(a);
		cout << a << "  " << b << endl;
	}
	return 0;
}
//----------------------------值传递和引用传递调用时会有歧义,需要进行函数局部声明
	/* (如果不想进行函数局部声明可以通过指针间接使用):
	void (*p_fun1)(char c) = &fun10;
	void (*p_fun2)(char &c) = &fun10;
	int main()
	{
		p_fun1(a);	//void __cdecl fun10(char)
		p_fun2(b);	//void __cdecl fun10(char&)
	} */

通过运行可以看出,值传递并不能改变实参

地址传递引用传递都通过函数内的形参改变了实参!!!

在这里插入图片描述

如果通过地址传递,我们需要额外申请(指针大小的)内存空间

现在通过引用传递不需要额外申请空间,因为引用只是变量的别名

( 传递也额外申请空间,大小不确定要根据类型,才能确定其大小)


并且不通过地址传递,可以省略解引用符(*),避免因指针操作失误而导致的内存问题

如果是查看,这三种都可以

如果要修改实参,不能采用值传递,可选择地址引用传递

推荐使用不额外申请空间的引用传递


三、引用与指针的区别

引用类似于指针,但还是有很多区别:

  • 指针存在空指针; 而定义了引用就要初始化,不存在空的引用! 错误写法: int &c;
  • 指针的指向可以改变; 引用了某个空间,引用的指向不能再改变 错误写法: int c = 12; b = c;
  • 与指针不同的是,指针可以有多级,引用只能有一级 错误写法: int a; int& b = a; int& c = b; 不能定义一个指向其间接引用的引用
  • 指针变量额外占用空间;引用不额外申请空间。

总结

引用原变量指向同一块内存空间,对引用操作就是对原变量进行操作

引用能够简化程序编写,优化内存使用和提高程序效率。

使用引用可以避免复制数据而产生额外的内存开销

注意事项

  • 引用初始化!并且只能指向已经存在的变量
  • 指向不能变!

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

推荐几款可以大幅提高开发效率的vscode插件

1、Vue 2 Snippets 这是一款基于vue2的代码片段提示插件&#xff0c;特别好用&#xff0c;可以有效的提高我们的编码速度。 他的能力非常强大&#xff0c;具体还需要我们去看他的文档文档地址 &#xff0c;解锁更多能力。 2、Path Autocomplete 这是一款路劲提示插件 vscod…

计算机网络实验第一课:HTTP和DNS

实验准备 1.先安装好wireshark 2.开启抓包&#xff0c;然后用过滤器选中http。 3.输入http://gaia.cs.umass.edu 网址&#xff0c;摁下回车键。&#xff08;这里我做实验的时候出了点意外&#xff0c;我一开始开着梯子&#xff0c;然后一直都是通过代理访问的网页&#xff…

Spring Security Oauth2.1 最新版 1.1.0 整合 (基于 springboot 3.1.0)gateway 完成授权认证

目录 背景 版本 Spring Boot 3.1 Spring Authorization Server 1.1.0官方文档 基础 spring security OAuth2.0 模块构成 授权方式 集成过程 官方demo 代码集成 依赖 授权服务AuthorizationServerConfig配置 重要组件 测试 查看授权服务配置 访问授权服务 授…

简单实用的快递查询工具,支持批量查询

大家如果遇到快递一直没到的情况&#xff0c;是不是会很心急呢&#xff1f;这时候就要去查询一下快递具体的运输轨迹了&#xff0c;看看自己的快递运输到哪里了。今天小编给大家推荐一款快递信息查询软件&#xff1a;“固乔快递查询助手”&#xff0c;这款软件能够自动识别单号…

管理类联考——英语——知识篇——考研英语熟词生义

考研英语熟词生义 A 1.abandon【生义】放松&#xff0c;沉溺 2.abide【【生义】容忍&#xff0c;经受住 3.abroad【生义】广为流传&#xff0c;传开 4.abrupt【生义】陡峭的&#xff0c;险峻的 5.absent【生义】漫不经心的 6.absolute【【生义】基本的 7.absorb【生义】…

Redis 发布和订阅详细介绍

发布和订阅 发布和订阅是什么 一句话&#xff1a;Redis 发布订阅(pub/sub) 是一种消息通信模式&#xff1a;发送者(pub) 发送消息&#xff0c;订阅者(sub) 接收消息 Redis 客户端可以订阅任意数量的频道 一图胜千言 1、客户端订阅频道示意图 2、当给这个频道发布消息后&am…

[CKA]考试之网络策略NetworkPolicy

由于最新的CKA考试改版&#xff0c;不允许存储书签&#xff0c;本博客致力怎么一步步从官网把答案找到&#xff0c;如何修改把题做对&#xff0c;下面开始我们的 CKA之旅 题目为&#xff1a; Task 在现有的namespace fubar中创建一个名为allow-port-from-namespace的新Netwo…

云原生时代崛起的编程语言Go远程调用gRPC实战

文章目录 概述定义背景特点四种服务方法 实战环境配置proto文件简单RPCToken认证服务器流式RPC客户端流式RPC双向流式RPC 概述 定义 gRPC 官网地址 https://grpc.io/ 源码release最新版本v1.55.1 gRPC 官网文档地址 https://grpc.io/docs/ gRPC 源码地址 https://github.com/g…

【vue3】13-前端路由-Vue-Router的详解: 从入门到掌握

前端路由 前端路由的发展历程认识前端路由&#xff1a;后端路由阶段前后端分离阶段 Vue-Router的使用vue-router的基本使用vue-router的使用过程基本使用的细节补充 路由懒加载分包处理路由的其他属性动态路由路由嵌套路由的编程式导航动态管理路由对象路由导航守卫钩子 前端路…

【毕业N年系列】 毕业第五年

距离上一篇 【毕业N年系列】已经过去一年时间了。没想到自己当初的一个简单的想法竟然能坚持到第五年&#xff0c;希望自己能坚持下去吧&#xff0c;在耄耋古稀之年依然能回看自己的人生。当然本来想着今天能早点下班回来写这篇文章&#xff0c;显然又没有实现&#xff0c;加班…

termux安卓手机 无线adb调试安卓手机

调试机安转termux app Apk下载 安装 https://f-droid.org/packages/com.termux 打开termux 挂载内部存储到~/storage 目录 $ temux-setup-storage 换源加快下载与更新速度 termux-change-repo 选 Main 然后 清华 下载基础软件 pkg install git vim perl nodejs-lts wget…

竞赛无人机搭积木式编程(三)---用户自定义航点自动飞行功能(全局定位,指哪打哪)

竞赛无人机搭积木式编程&#xff08;三&#xff09;---用户自定义航点自动飞行功能&#xff08;全局定位&#xff0c;指哪打哪&#xff09; 无名小哥 2023年6月10日 用户通过对前面两讲中全国大学生电子设计竞赛真题植保无人机&#xff08;2021&#xff09;、送货无人机&#…

新人如何学习性能测试?一文5个步骤带你入门性能测试!

写在前面&#xff1a;测试岗位细化后分为很多&#xff0c;功能测试、性能测试、自动化测试、测试开发&#xff0c;这些都叫测试。性能测试在所有测试分工中&#xff0c;地位和薪资都比较高&#xff0c;可见下方图片&#xff1a; 中级第3条&#xff0c;高级第1条&#xff0c;都是…

深度学习入门——感知机

1 感知机是什么 感知机接收多个输入信号&#xff0c;输出一个信号。这里所说的“信号”可以想象成电流或河流那样具备“流动性”的东西。像电流流过导线&#xff0c;向前方输送电子一样&#xff0c;感知机的信号也会形成流&#xff0c;向前方输送信息。但是&#xff0c;和实际…

Java集合-Collection Map

文章目录 概念IterableCollection接口List接口ArrayListVectorLinkedListArrayList 和 LinkedList 比较 SetHashSet LinkedHashSetMapHashMap 概念 1.集合主要是两组:单列集合(Collection) , 双列集合(Map) 2.Collection 接口有两个重要的子接口 List ,Set . 他们的实现子类都…

SWIG介绍和使用

官网&#xff1a;https://www.swig.org/ github&#xff1a;https://github.com/swig SWIG 是一种软件开发工具&#xff0c;可将用 C 和 C 编写的程序与各种高级编程语言连接起来。 SWIG 与不同类型的目标语言一起使用&#xff0c;包括常见的脚本语言&#xff0c;如 Javascri…

redis集群-Redis(六)

上篇文章介绍了哨兵架构以及集群搭建。 哨兵架构&redisCluster-Redis&#xff08;五&#xff09;https://blog.csdn.net/ke1ying/article/details/131178880 redisCluster 接着上篇文章继续讲解&#xff0c;前面一个linux服务器已经有了8001和8004节点&#xff0c;现在继…

八大典型的黑盒测试方法已来袭,快快接住!

前言 有了软件缺陷的暴露&#xff0c;我们就需要通过各种软件测试的方法来查找出软件的漏洞&#xff0c;编写出测试用例&#xff0c;及时修改bug。 在下面的这篇文章中&#xff0c;我们将谈论八大典型的黑盒测试方法&#xff0c;一起来学习⑧&#x1f4a1; 一、等价类划分法…

【Python实战】Python采集王者皮肤图片

前言 我们上一篇介绍了&#xff0c;如何采集王者最低战力&#xff0c;本文就来给大家介绍如何采集王者皮肤&#xff0c;买不起皮肤&#xff0c;当个桌面壁纸挺好的。下面&#xff0c;我和大家介绍如何获取数据。 环境使用 python 3.9pycharm 模块使用 requests 模块介绍 re…

c++返回值使用引用的注意事项

c返回值使用引用的注意事项 问题原因返回函数的引用形参另外一个问题解决方法 问题 引用变量b接受到的值为无意义的数字。 原因 int& b returnYingyong();相当于&#xff1a; int i2 3; int& b i2; 销毁 i2;将局部变量作为返回值&#xff0c;导致引用b数据无意义…