首先看一段代码:
#include<iostream>
using namespace std;
void fun(int*a){}
void fun(int&a){}
int main(){
int a=10;
fun(&a);
fun(a);
}
我们查看它的汇编结果时会发现引用和指针传参整个过程的汇编是一模一样的
我们再看下面这段代码:
long long a=10;
struct A{
long long&b=a;
};
int main(){
A c;
cout<<sizeof(A)<<sizeof(c.b);
}
如果是单纯的增加变量名和地址的映射关系的话输出结果应该是sizeof(long long)而不是sizeof(long long*)
那么引用只能是一个存储着地址的变量,只不过这个变量名指向的内容是地址内的东西,简单的来说,引用就是包装过的指针,编译阶段用一个地址占位,执行时解析为目标地址内的变量,这个过程和指针是一样的,区别在于解析过程
int* a = (int*)0;
int& b = *a;
cout << &b;//运行成功
cout<<b;//运行出错
站在汇编的层面上引用等同于指针二者区别无非是访问地址还是访问地址内的数据