C++57个入门知识点_06_ 什么是引用(需改变外部内容,用指针存在判断地址的问题、引用本质给外部内容起别名、fool(int& n) 外部函数:int& refN=n fool(refN/n))

本篇将会讲C++中很重要的概念-引用,引用得概念出现的是比较晚的,引用是在C语言中没有的,但是在C++,Java等都是很常见的。
那什么是引用?引用又有什么作用呢?本篇将会进行介绍。

总结:

  • 引用的使用情况:当需要改变外部内容(实参,跨作用域),使用指针需要进行地址的判断(保证不为空),为了避免指针问题,使用引用;
  • 引用的本质:给外部内容起了一个别名;
  • 如何定义引用:引用(左值引用)的写法:int& refN = n; &为取地址符号;
  • 如何使用引用:fool(int& n) 外部函数中:int& refN=n fool(refN)或者fool(n)

1. 形参无法改变实参值

首先看一段代码:不运行我们就知道结果,n最后还是5,这是因为foo(n)中的n是形参,是无法改变外边的n的值或者从生命周期的角度去考虑也是一样的结果

#include <iostream>
void foo(int n) 
{
	n = 8;
}

int main(int argc, char* argv[])
{
	int n = 5;
	fool(n);
	return 0;
}

运行结果:
在这里插入图片描述

2. 利用指针改变外部内容


如果我们需要在函数内部改变外部传来的参数,那我们会想到 利用指针来改变外部内容
代码如下:

#include <iostream>

void foo(int* n) 
{
	*n = 8;
}

int main(int argc, char* argv[])
{
	int n = 5;
	foo(&n);
	return 0;
}

运行结果:这是我们之前在C时使用的方法,此时foo(&n)不是像上边代码将形参的内容传递进来,而是把n的地址传给函数体foo(),所有foo()改变的是传递进来的地址的值,所以可以实现改变外部值的作用。
在这里插入图片描述

2.1 指针改变外部内容带来的问题


但是 指针会带来一些问题,指针是十分有用的,但也是十分危险的,你如果传的是指针,一定要对指针传的地址做检查

例如对上面的代码进行更改如下:

#include <iostream>

void foo(int* n) 
{
	*n = 8;
}

int main(int argc, char* argv[])
{
	int n = 5;
	foo(nullptr);
	return 0;
}

运行结果:由于传入的指针指向为空,空地址是没有分配内存的,造成崩溃,编译器只会在运行时才会发现
在这里插入图片描述
通过对指针是否为空的判断,可以预防上面问题的出现

#include <iostream>

void foo(int* n) 
{
	if (n == nullptr)
		return;
	*n = 8;
}

int main(int argc, char* argv[])
{
	int n = 5;
	foo(nullptr);
	return 0;
}

虽然上面的代码实现了指针是否为空的判断,相对安全一些,但是如果n的指针分配了内存,但是到函数调用时内存释放,还是会出现相同的情况?(不太懂)

3. 引用的概念

上述操作其实本质是改变内容,但是地址的确定无法检查,C++从语言层级避免使用指针,从而不用确认地址。因此提出引用的概念。

  • 引用(左值引用)的写法:int& refN = n; &为取地址符号
  • 引用的本质为:变量的别名

有如下代码:

#include <iostream>

int main(int argc, char* argv[])
{
	int n = 5;
	int& refN = n;
	refN = 6;
	return 0;
}

运行结果:可以看到nrefN的值都变为6
在这里插入图片描述
这是为什么呢?
refN引用了n的值,也就是说refN等价于n,改变refN的值等价于改变n的值
更深层次的说这是因为n在内存中的值为5,refN同时也指向内存中的5,改变refN的值,本质上就是改变内存中值

如果改变n的值,refN是否会发生改变呢?

#include <iostream>

int main(int argc, char* argv[])
{
	int n = 5;
	int& refN = n;
	refN = 6;
	n = 5;
	return 0;
}

运行结果:可以看到nrefN的值都变为5
在这里插入图片描述

4. 引用的本质及使用

  • 引用本质上可以理解为变量的别名
  • 如果需要在函数中改变外部的内容,而又不想使用指针,可以使用引用来实现

4.1 引用使用方法1


具体代码如下:

#include <iostream>

void fooRef(int& n)
{
	n = 6;
}
int main(int argc, char* argv[])
{
	int n = 5;
	int& refN = n;
	fooRef(refN);
	return 0;
}

运行结果:起到了和指针同样的效果
在这里插入图片描述
你想改变谁,就把谁的引用传过去,改变引用的值本质上就是对谁的改变

4.2 引用使用方法2


上面还有一种简单的写法:将n按照引用的方式传递进函数,更改变量值

#include <iostream>

void fooRef(int& n)
{
	n = 6;
}

int main(int argc, char* argv[])
{
	int n = 5;
	int& refN = n;
	fooRef(n);
	return 0;
}

运行的结果与上一致:
在这里插入图片描述

5. 学习视频地址:C++57个入门知识点_06_ 什么是引用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值