C++中的引用

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++】
在这里插入图片描述

接下来就要开始进行C++的学习路线了,听说这块的内容稍微难一些,不过我相信只要自己好好学习,态度端正的话总能把着块的内容学好学扎实的。一起加油啦各位!!!
让我们先从C

目录

  • 什么是引用
  • 引用的注意事项
  • 引用做函数参数
  • 引用做函数返回值
  • 引用的本质

什么是引用

引用这个概念听起来吓人,给人一种很难懂难过的一种感觉,但是没什么好害怕的。引用其实就是给我们的变量起了个小名而已,作用就是给变量起别名,并不是创建一块新的内存空间
结构:数据类型 &别名 = 原名
引用并不是新开辟了一块空间,只不过是给这个变量起另外一个名字,我们可以通过这个名字来操控这个变量所指向的那块空间。
我们直接来举个例子就好理解了:

#include<iostream>
using namespace std;
int main()
{
	int a = 10;
	int& b = a;
	return 0;
}

来看看a和b的地址相不相同,请看:
在这里插入图片描述

我们发现a和b的地址完全相同。
在这里插入图片描述

引用的注意事项

  • 引用的类型必须是与实体类型保持一致。
  • 引用必须初始化。
  • 引用在初始化就后不可以改变。

还是来举个例子:

#include<iostream>
using namespace std;
int main()
{
	int a = 10;
	int b = 20;
	//int &c;这种写法是错误的,因为引用必须进行初始化
	int& c = a;//引用一但初始化,就不可以更改
	c = b;//这是赋值操作,并不是更改利用,这句话的意思是把20赋值给c所指向的那块内存,
	//由于c是a的引用,所以a的内容也会跟着一起改变
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	cout << "c=" << c << endl;
	return 0;
}

在这里插入图片描述
在这里插入图片描述

引用做函数参数

我们在学习之前C语言的函数参数时,有两种函数参数传递的方式:一种是值传递,另外一种就是址传递。
现在,我们来学习第三种函数参数的传递方式:引用传递。其实,在C++中,所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

#include<iostream>
using namespace std;

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

int main()
{
	int a = 10;
	int b = 20;
	swap(a, b);
	cout << "a= " << a << endl;
	cout << "b= " << b << endl;
	return 0;
}

在这里插入图片描述

引用做函数返回值

引用做函数参数这里主要由两个点:
1.不要返回局部变量的引用
2.函数的调用可以作为左值
我们先来看第一种:不要返回局部变量的引用。

//不要返回局部变量的引用
#include<iostream>
using namespace std;

int& test1()
{
	int a = 10;
	return a;
}

int main()
{
	int& ret = test1();
	cout << "ret= " << ret << endl;
	return 0;
}

在这里插入图片描述
我们知道,局部变量存储在栈区中,一旦出了作用域就会被销毁。
因为a的内存已经释放了,此时我们如果再去访问a的内存就已经是非法操作了。所以说,局部变量存放在栈区中,不要返回局部变量的引用
现在我们来看第二点:函数的调用可以作为左值
在这之前,我们要知道static关键字的用法,static修饰的局部变量会变为静态变量,而静态变量会存放在全局区,会提高生命周期。而放在全局区中的的数据在程序结束后是由系统释放的。
请看:

//返回静态变量引用
#include<iostream>
using namespace std;

int& test2()
{
	static int a = 10;
	return a;
}
int main()
{
	int& ret2 = test2();
	cout << "ret2 = " << ret2 << endl;
	return 0;
}

在这里插入图片描述
函数的调用可以作为左值

//函数的调用可以作为左值
#include<iostream>
using namespace std;

int& test2()
{
	static int a = 10;
	return a;
}

int main()
{
	int& ret2 = test2();
	cout << "ret2 = " << ret2 << endl;
	test2() = 1000;//如果函数的返回值是引用,这个函数调用可以作为左值
	cout << "ret2 = " << ret2 << endl;
	return 0;
}

在这里插入图片描述

引用的本质

接下来我们来探索引用的本质。
本质:引用的本质其实就是一个指针常量
指针常量就是这个指针的指向不可以进行更改,但是指针指向的内容是可以进行更改的。
所以也就有了引用一旦初始化后,就不可以进行改变,这里的不可进行改变指的就是指针的指向不可以进行改变。
请看代码举例:

//引用的本质
#include<iostream>
using namespace std;

void fun(int& ret)
{
	ret = 200;
	//由于ret是引用,所以会自动转换为*ret=200
}

int main()
{
	int a = 10;

	int& ret = a;
	//自动转换为int* const ref = &a;
	//指针常量就是指针的指向不可以进行更改,这也就是为什么引用一旦进行初始化就不可以进行过更改

	ret = 20;//内部发现ret是引用,内部会自动转换为*ret=20

	cout << "a = " << a << endl;
	cout << "ret = " << ret << endl;

	fun(a);

	cout << "a = " << a << endl;
	cout << "ret = " << ret << endl;

	return 0;
}

在这里插入图片描述
好了,以上就是引用的一些最基本的理解了。就到这里吧,再见啦各位!!!
在这里插入图片描述

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

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

相关文章

java与Spring的循环依赖

java与Spring的循环依赖一、循环依赖是什么有什么危害二、循环依赖在Spring中的体现和类型三、Spirng如何解决循环依赖四、总结一、循环依赖是什么有什么危害 什么是循环依赖 java中循环依赖用一张图来说就是下图&#xff1a;在对象的创建过程中多个对象形成了依赖闭环&#xf…

初识linux之管道

一、进程间通信的概念大家都知道&#xff0c;进程是具有独立性的&#xff0c;因为一个程序运行起来生成进程时&#xff0c;也会生成它的进程结构体&#xff0c;即PCB&#xff0c;然后然后通过进程结构体中的结构体指针找到它的虚拟地址空间&#xff0c;然后再通过它的页表映射到…

C语言——字符函数和字符串函数【详解】(一)

文章目录函数介绍1.strlen2.strcpy3. strcat4. strcmp5. strncpy6. strncat7. strncmp8. strstr函数介绍 求字符串长度 strlen 长度不受限制的字符串函数&#xff08;使用时不安全&#xff09; strcpy strcat strcmp 长度受限制的字符串函数介绍&#xff08;与长度不受限制函数…

【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(9)

目录 写在前面&#xff1a; 题目&#xff1a;P1025 [NOIP2001 提高组] 数的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 解题思路&#xff1a; 代…

【数据结构】哈希表

目录 1、哈希表 1.1 哈希表的简介 1.2 降低哈希冲突率 1.3 解决哈希冲突 1.3.1 闭散列 1.3.2 开散列&#xff08;哈希桶&#xff09; 1、哈希表 1.1 哈希表的简介 假设我们目前有一组数据&#xff0c;我们要从这组数据中找到指定的 key 值&#xff0c;那么咱们目…

【Java集合面试宝典】HashMap的put流程和特性?HashMap的扩容机制?原理— day08

目录 数组和链表分别适用于什么场景&#xff0c;为什么&#xff1f; 数组 链表 List和Set的区别 List和Map、Set的区别 HashMap 、HashTable 和TreeMap有什么区别&#xff1f; hashmap的特性 HashMap和HashTable有什么区别&#xff1f;&#xff08;必会&#xff09; J…

【数据结构】树的介绍

文章目录前言树的概念及结构树的概念树的表示树在实际中的运用二叉树的概念及结构二叉树的概念现实中的二叉树特殊的二叉树二叉树的性质二叉树的储存结构顺序存储链式存储写在最后前言 &#x1f6a9;本章给大家介绍一下树。树的难度相对于前面的数据结构来说&#xff0c;又高了…

ESP32设备驱动-HDC1080温度湿度传感器驱动

HDC1080温度湿度传感器驱动 文章目录 HDC1080温度湿度传感器驱动1、HDC1080介绍2、硬件准备3、软件准备4、驱动实现1、HDC1080介绍 HDC1080 是一款集成温度传感器的数字湿度传感器,可在极低功耗下提供出色的测量精度。 HDC1080 在很宽的电源范围内工作,是一种低成本、低功耗…

“提效”|教你用ChatGPT玩数据

ChatGPT与数据分析&#xff08;二&#xff09; 上文给简单聊了一下为什么ChatGPT不能取代数据分析师&#xff0c;本文我们来深入感受一下如何让GPT帮助数据分析师“提效”。 场景一&#xff1a;SQL取数 背景&#xff1a;多数数据分析师都要用SQL语言从数据库中提取数据&#x…

ctfshow web入门 命令执行29-33

1.web29eval()函数是把所有字符串当作php代码去执行&#xff0c;这题过滤了flag,使用通配符绕过过滤应该要注意文件中没有重名的文件&#xff0c;或一部分是一样的文件payload:cecho%20nl flag.php; #官方解法&#xff0c;反引号表示执行系统命令&#xff0c;nl为linux系统命令…

springboot智慧外贸平台

053-springboot智慧外贸平台演示录像2022开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff…

干货:浅谈主数据管理项目建设思路

“主数据是数据之源&#xff0c;是数据资产管理的核心&#xff0c;是信息系统互联互通的基石&#xff0c;是信息化和数字化的重要基础。 ——《主数据管理实践白皮书》” 近期&#xff0c;国家印发《数字中国建设整体布局规划》&#xff0c;提出数字中国建设的整体框架…

I2C协议简介 Verilog实现

I2C协议 IIC 协议是三种最常用的串行通信协议&#xff08;I2C&#xff0c;SPI&#xff0c;UART&#xff09;之一&#xff0c;接口包含 SDA&#xff08;串行数据线&#xff09;和 SCL&#xff08;串行时钟线&#xff09;&#xff0c;均为双向端口。I2C 仅使用两根信号线&#xf…

Django 实现瀑布流

需求分析 现在是 "图片为王"的时代&#xff0c;在浏览一些网站时&#xff0c;经常会看到类似于这种满屏都是图片。图片大小不一&#xff0c;却按空间排列&#xff0c;就这是瀑布流布局。 以瀑布流形式布局&#xff0c;从数据库中取出图片每次取出等量&#xff08;7 …

Educational Codeforces Round 145 (Rated for Div. 2) (A~E)

Problem - B - Codeforces 思路&#xff1a; 我们选择长度后&#xff0c;其特定长度会构成一个正方形&#xff0c;因为点与点距离大于1&#xff0c;所以偶数的正方形里面只能包含偶数的正方形&#xff0c;奇数的包含奇数。计算每个长度容纳最大点数&#xff1a; 发现cnt[0]1,…

WPF毛笔字实现过程

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Python中生产者消费者模型

Python生产者消费者模型 一、消费模式 生产者消费者模式 是Controlnet网络中特有的一种传输数据的模式。用于两个CPU之间传输数据&#xff0c;即使是不同类型同一厂家的CPU也可以通过设置来使用。 二、传输原理 类似与点对点传送&#xff0c;又略有不同&#xff0c;一个生产…

能把爬虫讲的这么透彻的,没有20年功夫还真不行【0基础也能看懂】

前言 可以说很多人学编程&#xff0c;不玩点爬虫确实少了很多意思&#xff0c;不管是业余、接私活还是职业爬虫&#xff0c;爬虫世界确实挺精彩的。 今天来给大家浅谈一下爬虫&#xff0c;目的是让准备学爬虫或者刚开始起步的小伙伴们&#xff0c;对爬虫有一个更深更全的认知…

chatGPT爆火,什么时候中国能有自己的“ChatGPT“

目录 引言 一、ChatGPT爆火 二、中国何时能有自己的"ChatGPT" 三、为什么openai可以做出chatGPT? 四、结论 引言 随着人工智能技术的不断发展&#xff0c;自然语言处理技术也逐渐成为了研究的热点之一。其中&#xff0c;ChatGPT作为一项领先的自然语言处理技术…

【软件测试】基础知识第一篇

文章目录一. 什么是软件测试二. 测试和调试的区别三. 什么是测试用例四. 软件的生命周期五. 软件测试的生命周期一. 什么是软件测试 软件测试就是验证软件产品特性是否满足用户的需求。 那需求又是什么呢&#xff1f;在多数软件公司&#xff0c;会有两种需求&#xff0c;一种…