C++基础——引用讲解1

2023-11-19

目录

6.1 引用概念

        1.定义:

        2.引用的格式:

2.引用的特性

 三.引用的用法

1.有了引用,就不需要取地址了。

2.引用的另一大用法:

引用这么强的功能 能不能代替指针?


6.1 引用概念

        1.定义:

        引用不是新定义一个变量,而是给已存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 例如:在水浒传中,梁山的首领叫宋江,梁山好汉称呼他为公明哥哥,江湖人称他为及时雨,

        2.引用的格式:

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

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

验证:表明ra与变量a是同一个东西,正可谓一荣俱荣,一损俱损! 

注意:引用类型必须和引用实体是同种类型的。否则会报错。

 练习题:

int main() {
	int a = 10;
	int& pa = a;
	int& x = a;
	int& y = x;

	x++;
	y++;
	pa++;
	a++;
	cout << "a的值为:" << a << endl;	
	return 0;
}

答案为:14,x作为变量a的引用,又被y当作引用引用,说到底还是变量a在++ 。

2.引用的特性

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

对于第一点来说: 

对于第二点来说,上个例题已经验证过了。

对于第三点:

 三.引用的用法

1.有了引用,就不需要取地址了。

//指针用法
void Swap1(int* pm, int* pn) {
	int tmp = *pm;
	*pm = *pn;
	*pn = tmp;
}


//引用用法
void Swap2(int& m, int& n) {
	int tmp = m;
	m = n;
	n = tmp;
	}

int main() {
	int aa = 10;
	int bb = 20;
	Swap1(&aa, &bb);    //取地址

	int cc = 1;
	int dd = 2;
	Swap2(cc, dd);      //不取地址

	cout << "aa:" << aa << "	bb:" << bb << endl;
	cout << "cc:" << cc << "	dd:" << dd << endl;
}

结果: 

我们会发现取地址的写法交换函数比引用写法的交换函数要复杂很多,这便是C++对于C语言使用指针的复杂性缺陷而研发出来的引用。

2.引用的另一大用法:

在之前学习数据结构链表的过程中,我通过使用二级指针去进行头插头删,因为修改结构体指针需要用到二级指针(改变指针地址的指针)

感兴趣的小伙伴可以去看看我写链表的博客:数据结构之链表详解(1)

指针的这种写法大大增加了代码的复杂性,可读性极差,而使用引用可以从根本上简化代码。给结构体指针的形参取别名,这样phead被修改了,那么plist也得变

void SlistPushFront(struct Node*& phead, int x) {

}

int main() {
	struct Node* plist = NULL;
		SlistPushFront(plist, 1);
		SlistPushFront(plist, 2);
	return 0;
}

这时会引发出一个问题:

引用这么强的功能 能不能代替指针?

1. 引用概念上定义一个变量的别名,指针存储一个变量地址。

2. 引用在定义时必须初始化,指针没有要求

3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体

4. 没有NULL引用,但有NULL指针

5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)

6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

7. 有多级指针,但是没有多级引用

8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理

9. 引用比指针使用起来相对更安全

在效率上:
其实两者的效率是一致的,因为在底层中,指针和引用的参数都指向同一个地址。
在高级编程语言中,因为用*传参可能会指向空的地址或者错误的地址,所以要时时判断参数是否为空,导致降低效率。
而用&传参数,则参数不可能为空或者错误地址,这也算稍微提升了一些效率。

所以说各有各的好处,只是引用和指针在部分领域上互通可替换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++基础——引用讲解1 的相关文章

随机推荐

  • Unity的三级排序层级渲染Layer,sorting layer,order in layer

    一 前言 Unity游戏开发中 模型 界面 特效等等 需要规划好层的概念 涉及到摄像机 Camera 画布 Canvas Shader等相关内容 Unity大致按照三级排序进行层级渲染 Camera的Depth CullingMask gt
  • 模块化规范

    常用模块化有两种规范 commonJS和ES6 一 两者区别 二 如何转义 我们常遇到的使用场景是 在commonJS的模块里需要引入ES6规范的模块 这时就需要把ES6模块转译为commonJS规范的模块 否则报错 转义工具有 Babel
  • mysql udf函数_Linux平台下 MYSQL用户自定义函数(UDF)的利用

    来源 http hi baidu com ylbhz Linux平台下 MYSQL用户自定义函数 UDF 的利用 Chris Anley chris ngssoftware com 5th July 2004 根据MySQL函数族的可扩展机
  • 双向A*算法的Python实现

    双向A 算法的Python实现 双向A算法是一种用于寻找最短路径的启发式搜索算法 它通过同时从起点和终点进行搜索 以加快搜索过程并找到最短路径 在本文中 我们将介绍如何使用Python实现双向A算法 并提供相应的源代码 算法步骤 创建一个节
  • 【机器学习算法模型】关联分析——Apriori

    机器学习算法模型 关联分析 Apriori 参考材料 1 统计学习方法 李航 2 机器学习 周志华 3 数据挖掘 概念与技术 范明 孟小峰译
  • bigdecimal类型和String类型互相转换

    实现bigdecimal类型转成String类型 BigDecimal bd new BigDecimal xxx String str bd toString String类型转成bigdecimal类型 String str xxx B
  • 【SQL基础-1】SQL基本语句—增删改查

    目录 1 SQL 增删改查基本语句 2 查 select 语句 2 1 select 基本语句 2 2 Select distinct 语句 2 3 Select where 语句 2 4 Select order by 语句 2 5 Se
  • 数据表数据迁移——复制一个表的数据到另外一个表

    通过 SQL 你可以从一个表复制信息到另一个表 MySQL 数据库不支持 SELECT INTO 语句 但支持 INSERT INTO SELECT 1 SQL SELECT INTO 语法 SELECT INTO 语句从一个表复制数据 然
  • App登录状态维持

    转载地址 http www jianshu com p 4b6b04244773 目前APP大都支持长登录 就是用户登录一次后 如果用户没有主动注销 清除APP缓存数据或卸载APP 就在一段时间内或一直保持登录状态 一般情况下 有以下三种方
  • log4j升级log4j2

    项目版本统一升级 主要就是三点一 去除log4j原来的相关的引用 具体是这几个包 maven相关就找对应名字就对了 这些都是关于log4j1的二 添加新的log4j2的相关引用 其中 来源https blog csdn net catoop
  • 漫画:什么是 CAS 机制?

    https blog csdn net bjweimengshu article details 78949435点击上方 程序员小灰 选择 置顶公众号 有趣有内涵的文章第一时间送达 第二天
  • Apollo注册到自己的Eureka注册中心+配置中心集群(超详细)

    重要提示 在任何步骤开始之前 谨记下面的东西 在对apollo master这个文件进行处理的时候 要找到文件夹scripts下的文件build bat 苹果用户请找到build sh 并且在最开始的时候运行上述两个文件 在工程文件夹下 s
  • linux升级openssh9

    下载 下载 libressl 3 5 3 tar gz openssh 9 0p1 tar gz zlib 1 2 12 tar gz 放到 usr local 目录下 链接 https pan baidu com s 1ZCyDDmJ5h
  • 华为OD机试 - 分糖果(Java & C)

    题目描述 小明从糖果盒中随意抓一把糖果 每次小明会取出一半的糖果分给同学们 当糖果不能平均分配时 小明可以选择从糖果盒中 假设盒中糖果足够 取出一个糖果或放回一个糖果 小明最少需要多少次 取出 放回和平均分配均记一次 能将手中糖果分至只剩一
  • 【AcDbRegion::createFromCurves】

    public static class AcRxClass cdecl AcDbRegion desc void desc AcDbRegion SAPEAVAcRxClass XZ 函数 public static enum Acad E
  • 掌握Python的X篇_18_字典(通过“{}“定义一个字典)

    文章目录 1 字典是什么 2 字典的基本操作 2 1 定义字典 2 2 添加元素 2 3 通过Key引用value 2 4 删除元素 2 5 遍历字典中元素 1 字典是什么 list作为容器已经非常方便 但是引用list中的元素是依赖下标
  • 第十二章_Redis单线程 VS 多线程

    Redis为什么选择单线程 是什么 这种问法其实并不严谨 为啥这么说呢 Redis的版本很多3 x 4 x 6 x 版本不同架构也是不同的 不限定版本问是否单线程也不太严谨 1 版本3 x 最早版本 也就是大家口口相传的redis是单线程
  • 史上最全 ——LINQ to SQL语句

    适用场景 实现过滤 查询等功能 说明 与SQL命令中的Where作用相似 都是起到范围限定也就是过滤作用的 而判断条件就是它后面所接的子句 Where操作包括3种形式 分别为简单形式 关系条件形式 First 形式 下面分别用实例举例下 1
  • 单片机中常用的C语言编程

    单片机内部集成了CPU RAM ROM 定时器 中断系统 通讯接口等一系列电脑的常用硬件功能 其任务是信息采集 依靠传感器 处理 依靠CPU 和硬件设备 例如电机 LED等 的控制 在给单片机输入灵魂时常使用C语言进行编程 本文以keil
  • C++基础——引用讲解1

    目录 6 1 引用概念 1 定义 2 引用的格式 2 引用的特性 三 引用的用法 1 有了引用 就不需要取地址了 2 引用的另一大用法 引用这么强的功能 能不能代替指针 6 1 引用概念 1 定义 引用不是新定义一个变量 而是给已存在的变量