在概念上来看,引用就是一个“别名”,不会给他分配空间,和其引用的实体共用一个空间。
在底层实现上,引用就是指针。
虽然引用的定义是不会给他分配空间,但是在现在大多数的编译器当中,都会给引用分配空间。
但其实引用在底层实现上实际上是有空间的。(可以自己用代码检查一下)
int main() {
int a = 1;
int& ra = a;
ra = 2;//用引用
int* qa = &a;
*qa = 3;//用指针
return 0;
}
我们可以看一下引用和指针的汇编代码,如下。
是一模一样的。
不同点:
1,可以有多级指针,但是不可以有多级引用。
2,引用比指针更加安全。(由于不存在空引用,并且引用一旦被初始化为指向一个对象,他就不能被改变为指向另一个对象的引用,因此引用很安全。对于指针来说,他可以随时指向其他的对象,并且可以不被初始化,或者为NULL,所以不安全。const指针虽然不可以改变指向,但仍然存在空指针,并且有可能产生野指针,就是多个指针指向一块内存,free掉一个指针之后,其他指针就变成野指针)
3,引用在定义时候必须初始化,指针却没有要求。
4,没有NULL引用,但是可以有空指针
5,引用自加即引用的实体增加1,指针自加即是指针向后偏移一个类型大小。
6,引用在初始化以后引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型的实体
7,在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占四个字节)。
8,访问实体的方式不同,指针需要显式解引用,引用编译器会自己处理。