引用相关知识参见此文章:c++引用
那么引用和指针到底有什么区别呢?
答:看下面这段代码!!
int main()
{
int a = 10;
int *pa = &a;
*pa = 20;
int& ra = a;
ra = 20;
return 0;
}
汇编代码及执行过程如下:
因此,两者在底层处理方式:一模一样
在底层:编译器在底层将引用按照指针的方式来进行处理的
引用实际就是指针 T& 就相当于 T* const
const T& 相当于 const T* const
在底层,引用变量实际是有空间的
概念层面:引用就是变量的别名,与其实体公用同一块内存空间,编译器不会为引用变量开辟新的内存空间。
区别: 1、引用在定义期间必须初始化,而指针没有要求
2、引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
3、没有NULL引用(就是引用必须初始化),但有NULL指针
4、在sizeof中含义不同;引用结果为引用类型的大小,但指针始终是地址空间所占字节数(32位平台下占 4 个字节,某些64位平台 8 个字节,有些64位系统是按32位系统来编译的
5、引用自加即引用的实体加 1 ,指针自加即指针向后偏移一个类型的大小
6、有多级指针,但是没有多级引用(有char **p,没有char&& rc = ch; 但是const char&& rrc = ‘c’;这种可以,叫右值引用,是c++11里的)
7、访问实体方式不同,指针需要显式解引用,引用编译器自己处理
8、引用比指针使用起来相对更安全(不会空引用,不能有空指针)