目录
前言
在C语言中,函数传递参数有值传递和地址传递两种类型。其中,地址传递采用的是指针。一般来说,指针带有*号,当代码逻辑较为复杂时,这种写法可读性比较差,而且不容易区分并理解。因此,C++多了一种策略——引用。
一、引用的基本用法
首先,我们先来介绍一下引用的基本用法,慢慢揭开它的神秘面纱。
引用相当于给变量起别名,通过别名改变数值,原变量的值也会改变。
#include<iostream>
using namespace std;
int main() {
int a = 8;
int& b = a;
b = 4;
cout << a<<endl;
cout << b;
return 0;
}
运行结果如下:
可以看到,当我们改变b的值时,a的值也会改变,这就相当于一个指针的作用 ,函数通过引用进行传参时,我们也可以把它看作是地址传递。我们再举个生活中的例子来加深一下理解。
有个人长的很帅,他的名字叫做张三,但是他的妈妈觉得这个名字念起来不是很顺口,于是给他起了一个小名,叫做乐乐。于是,无论我们叫张三还是乐乐,都是指这个妈妈的宝贝儿子。她儿子变胖了,我们既可以说张三变胖了,也可以说乐乐变胖了。
听完这个解释,大家心里是不是更清楚了呢?下面我们再来谈谈引用的本质以及一些更具体的用法。
二、引用的本质
引用的本质是一个指针常量,int& b = a 相当于int*const b = a 。
什么是指针常量?它的作用是什么呢?我们先来区分两个概念:常量指针和指针常量。
常量指针的形式举例: const int* p = a ; 它的意义是指针的指向可以修改,但指针指向的值不能修改。指针常量的形式举例: int* const p = a ; 它的意义是指针的指向不能修改,但指针指向的值可以修改。 看起来是不是很绕?是不是感觉很容易混淆?下面这种理解能帮助我们很好地记忆。
一般的指针形式为 int* p ; 常量指针就是先写常量const再写指针int*,即 const int *p ; 指针常量就是先写指针 int* 在写常量const,即 int* const p ;如果 const后面是*p(*p表示取值),表示值不能改变,指向(地址)可以改变;如果const后面只有p(p表示指向的地址),表示指向(地址)不能改变,值可以改变。
#include<iostream>
using namespace std;
int main() {
int a = 8;
int* const b = &a;//int& b = a ; 引用的本质为一个指针常量
*b = 4;
cout << a<<endl;
cout << *b;
return 0;
}
运行结果如下:
三、 三种具体的引用场景
下面我们从三个角度介绍引用的具体使用以及一些注意事项:
- 函数中的引用
- 指针的应用
- 常量引用
1.函数中的引用
函数中的引用是一种地址传递。引用可以作为函数的形参。
示例代码如下:
#include<iostream>
using namespace std;
//函数引用,一种地址传递,相当于指针的作用
void change(int& a) {
a = 8;
}
int main() {
int a = 3;
change(a);
cout << a;
return 0;
}
运行结果如下:
有一个需要注意的点,我们不能在函数中返回局部变量的引用,因为当我们调用完函数后,函数所使用的栈空间将被销毁,函数里局部变量的地址被释放,不能再使用。
2.指针的引用
指针的引用相当于一个指向指针的一个常量指针,类似于一个二级指针。
p是一个指针常量,可以通过p来改变指针q的指向。代码示例如下:
#include<iostream>
using namespace std;
int main() {
int a=4;
int* q = NULL;
int*& p = q;
p = &a;
cout << *p<<endl;
cout << *q;
return 0;
}
运行结果如下:
3.常量引用
引用可以改变值,不能改变指向;常量引用既不能改变值,也不能改变指向。
如果我们去改变值的话,编译器将会给我们报错。
总结
总体上讲,引用的发明能够减少我们书写代码时候的复杂度,增加其可读性。如果您还觉得这篇文章不错的话,不如亲自动手去体验一下引用所带来的全新乐趣吧!学习过程虽然有些枯燥,但是请相信最后有所收获后心情一定是非常舒畅、非常开心的。