引用是对一个变量或者对象取的别名
定义:真名的数据类型& 别名 = 真名;
既然是对一个变量或者对象取别名,那就得先有变量或对象,不能凭空取一个别名。也就是定义引用必须初始化。
- 对引用的操作和对引用对应的变量的操作是完全等价的
- 引用的类型必须和其所对应的变量的类型相同
- 引用不是定义新的变量或对象,因此不会为引用开辟新的空间内存
示例:
#include<iostream>
using namespace std;
int main() {
int a = 8;
int& ref_a = a;
ref_a++;
cout << a << endl;//9
}
其实引用就是指针的语法糖(syntax sugar)
我们为什么要使用引用呢?我们干嘛要起个别名而不直接用真名呢?
假设我们想通过调用一个函数来实现一个整型变量的自增,有下面3种传递方式
值传递:形参的改变无法改变实参的值
void fun(int x) {
x++;
}
int main() {
int a = 8;
fun(a);
cout << a << endl;//8
}
地址传递:形参的改变可以改变实参的值
void fun(int* x) {
(*x)++;//不加括号就会先自增再解引用
}
int main() {
int a = 8;
fun(&a);
cout << a << endl;//9
}
引用传递:形参的改变可以改变实参的值
void fun(int& x) {
x++;
}
int main() {
int a = 8;
fun(a);
cout << a << endl;//9
}
是不是比使用指针更简洁些呢
那么,可不可以给引用取别名呢?答案是可以的
int a = 8;
int& a1 = a;
int& a2 = a1;//给引用取别名(引用的嵌套)
int& a3 = a;//同一个对象或变量可以取多个别名
引用和指针的区别
- 指针是另一个变量,而引用是自己本身,指针会占用额外存储空间,但引用不会占用额外存储空间,也就是说别名和真名是同一个东西,共享同一块内存
- 指针可以不用初始化赋值,但是引用必须初始化赋值
- 指针可以有多级指针,但是引用没有多级引用
- 指针可以改变指向,但是引用不能改变其所指代的变量或对象
- 指针是间接访问,引用是直接访问
关于指针的更多内容:【C语言】指针