C++的引用
- 左值引用和右值引用
- 引用的实例
1)引用是一种更安全的指针。
2)引用只有一级引用,没有多级;指针可以有一级指针,也可以有多级指针。
int main()
{
int a = 10;
int *p = &a;//(指针)int *p = nullptr;编译链接没有错,但是没有输出结果
int &b = a;//(引用)
*p = 20;
//输出结果:20 20 20
cout << a << " " << *p << " " << b << endl;
b = 30;
//输出结果:30 30 30
cout << a << " " << *p << " " << b << endl;
return 0;
}
3)加断点后,转到反汇编代码,可以看出,从汇编代码的角度上里说,定义指针和定义引用说的意义是一样的,都是通过指针来实现的,都是先将a的地址放入寄存器eax,然后再将eax寄存器里面的地址放到p和b的4字节内存里;通过引用变量修改引用内存的值,和通过指针解引用修改指针指向的内存的值,其底层指令也是一模一样的。
int *p = &a;//int *p = nullptr;编译链接没有错,但是没有输出结果
013E245F lea eax,[a]
013E2462 mov dword ptr [p],eax
int &b = a;
013E2465 lea eax,[a]
013E2468 mov dword ptr [b],eax
但是注意,我们在定义引用变量时,根据定义,
1、必须初始化;
2、初始化时引用变量的右值必须是一个可以取地址的值。
所以以下代码是错误的:
int &c = 20;//20是一个不能取地址的值;
引用实际上相当于给数组arr起了一个别名,所以它的本质还是数组arr,如果对于使用引用不熟练,可以先定义一个指针变量,然后再将指针的取地址,换成要引用的变量,然后再用“ & ”将“ * ”
覆盖就是一个合理的引用了。
int main()
{
int arr[5] = {
};
int *p = arr;
//通过指针int (*q)[5] = &arr;
//定义一个引用变量,来引用数组arr
int (&q