引用(reference)
对于计算机来说,引用和指针很类似,都表示地址。
但是一定要注意,引用本身不是新的变量,也不创造新的变量,它是对以往的变量的引用。
1.常见的引用写法
int&
是一种引用类型,不是给int
取址,可以用这个类型创建引用。
具体来说,为已经存在的变量创建了一个别名(alias)。
int a = 8;
int& ref = a;
像这个案例中,真正的变量只有a
一个,ref
不是一个新的变量,ref
就是a
,修改ref
和修改a
是等价的。
2.参数传递时的引用
当我们想用函数修改变量时,我们可以利用引用来实际上修改原本的变量。
函数传参有指针传递和引用传递,接下来我们对比学习两种 。
从我个人学习来看,引用是可读性更好的一个选择
2.1 指针传参
用指针的话相对繁琐,我们在函数内还要解引用(dereference)。
指针实际上就是地址,这个过程中我们传递的是地址,当我们修改变量时自然就需要解引用。
注:解引用符号优先级低于四则运算,运算时要加上括号
void Increasement(int* value) {
(*value) ++;
}
int main() {
int a = 8;
Increasement(&a);
}
2.2 引用传参
使用传引用的话,函数中的变量和原本的变量是同一个,自然不再需要解引用。
这一点可以通过调试来观察。
注:调试在第11讲中学习过,这里我们需要用到断点(breakpoint)和步入(F11)
void Increasement(int& value) { //这一句就相当于int& value = a
value++;
}
int main() {
int a = 8;
Increasement(a);
}
不妨在main()
函数中调用Increasement()
的地方设置断点
注:断点是让程序运行到该句之前
此时,我们可以在内存窗口查看a的地址
和a的值
,此时value
还不存在
接下来我们进入Increasement(),此时value创建完成,我们可以看到value的地址
和value的值
可以看到,显然value和a指的就是同一个变量。
根据上面的观察,我们就可以理解到,传引用不再是传地址给函数,而是传了变量本身进去,自然在运算时也不必需要解引用之类的,因为这里的value
就是a
3.引用不可修改
引用只有定义时可以赋值。
错误情况一:想要再次赋值。
不可以,因为此后ref
就是a
,ref = b
表示的意思是a = b
,即把b的值赋给a。
&ref
表示的就是&a
也就是a的地址
,是不可以修改的。
int a = 5;
int b = 8;
int& ref = a; //ref是a的别名
ref = b; //把b的值也就是8赋值给a,而不是把ref换成b的别名
错误情况二:先声明,后赋值。
声明引用时必须立刻给出引用变量,不允许先声明后给值。
int &ref;
ref = a; //这就是不合法的
学习资料来源:https://www.youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb
欢迎大家关注视频原作者cherno,本文是我对其视频的学习笔记。