💓博主CSDN主页:杭电码农-NEO💓
⏩专栏分类:C++初阶之路⏪
🚚代码仓库:NEO的学习日记🚚
🌹关注我🫵带你学习排序知识
🔝🔝
1. 前言
C语言中有一利器: 指针
而C++中增加了另一利器: 引用
这两个板块的存在
极大了提升了C/C++的可用性!
本篇文章将给大家详细讲解引用
并且分析引用和指针的联系和区别
最后给大家拓展C++中的空指针
2. 引用的概念
概念:
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间
比如说孙悟空又叫
孙行者,齐天大圣,斗战胜佛
李逵又叫黑旋风,铁牛
类型& 引用变量名(对象名) = 引用实体
引用符号:&
举个例子来说明:
int a = 10; int& ra = a;//<====定义引用类型 printf("%p\n", &a);//打印地址 printf("%p\n", &ra);
打印出来的地址相同
并且引用值改变,原先的值也会改变!
int a = 10; int& ra = a; cout << ra <<' '<< a; cout << endl; ra = 20; cout << ra << ' ' << a;
a的值会从10被修改成20
3. 引用的特性
引用特性:
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 一旦引用一个实体,就不能引用其他实体
特性讲解:
int a = 10; int& ra; // 没初始化,会报错 int& ra = a; int& rra = a; int& rrra = a; //这三个都是a的引用,只要其中一个 //发生改变,其他三个也会改变 printf("%p %p %p %p\n", &a, &ra, &rra, &rrra);
int a = 10; int& ra = a; int b = 20; ra = b; //这条语句的意思是将b的值赋值给a //而不是ra从a的引用变成b的引用 cout << ra << ' ' << a << ' ' << b; cout << endl; printf("a的地址:%p ra的地址:%p b的地址:%p", &a, &ra, &b);
可以看见ra的地址和a是一样的
一旦引用初始化后就不能改变引用对象
4. 常引用
顾名思义就是引用常量
但是常量具有不可修改性
所以引用一个常量时要加上const
const int a = 10; //int& ra = a; // 该语句编译时会出错,a为常量 const int& ra = a; // int& b = 10; // 该语句编译时会出错,b为常量 const int& b = 10; double d = 12.34; //const int& rd = d; // 该语句编译时会出错,类型不同 const double& rd = d;
并且引用的类型要对上
int类型的引用对应int&
double类型的引用对应double&
…
5. 使用场景
5.1 引用做函数参数
引用做函数参数
之前在写C程序的交换函数时
因为形参是实参的一份拷贝
想要改变实参就要传地址
而现在有了引用就不用传地址了!
void Swap(int& left, int& right)//交换函数 { int temp = left; left = right; right = temp; } int a = 10; int b = 20; Swap(a,b);//因为形参为引用,所以这传的是a,b的引用
注: 引用传参时,不用加符号&
& 符号放在类型后面时是引用
其他地方& 符号都是取地址!