在文章的开始可以先看这样一段C++代码:
int main(void)
{
int a = 0;
int& ra = a;
int n = 0;
int* pn = &n;
return 0;
}
这段代码转换为汇编代码是这样的(由于没有在CSDN的代码选项里面找到汇编,我直接复制重要部分的汇编代码吧)
int a = 0;
00007FF7E6EF224D mov dword ptr [a],0
int& ra = a;
00007FF7E6EF2254 lea rax,[a]
00007FF7E6EF2258 mov qword ptr [ra],rax
int n = 0;
00007FF7E6EF225C mov dword ptr [n],0
int* pn = &n;
00007FF7E6EF2263 lea rax,[n]
00007FF7E6EF2267 mov qword ptr [pn],rax
可以看到,定义引用和定义指针的汇编代码并无区别。所以,我们可以把引用看作指针去理解,但是它又与指针有着许多的区别:
1.初始化
指针不初始化,代码可以运行,虽然会被编译器口头警告;但引用不一样,如果引用不进行初始化,代码是直接无法运行,并且引用的初始化赋值只能是一个对象,无法用NULL或者是nullptr对其初始化。
2.赋值
定义一个可读可写的指针,这个指针和变量一样是可以重新被赋值的 。 引用是否也可以被重新赋值呢?
#include<iostream>
using std::cout;
int main(void)
{
int p = 9;
int& b = p;
int a = 10;
b = a;
//int& b = a;
cout << b;
return 0;
}
可以看到,b = a;这步操作只是把a的值赋给了b,而下