这篇文章记述了关于指针与引用的知识点。
指针与引用
我们可以把引用理解成变量的别名。定义一个引用的时候,程序把该引用和它的初始值绑定在一起,而不是拷贝它。计算机必须在声明r的同时就要对它初始化,并且,r一经声明,就不可以再和其它对象绑定在一起了。
实际上,你也可以把引用看做是通过一个=指针常量=来实现的,它只能绑定到初始化它的对象上。
关于指针和引用的对比,可以参看<<more effective C++>>中的第一条条款,引用的一个优点是它一定不为空,因此相对于指针,它不用检查它所指对象是否为空,这增加了效率
1 | int a,b,*p,&r=a;//正确 |
对于指针来说,它是一个地址,这个地址是一个数值,那么就意味这个数值可以为0(空指针),也可以为其他,即指针可以不指向任何东西。
而对于引用来说,他是一个外号,外号一定是“某个存在物体”的外号,所以引用不能为空,即不能存在空引用。


引用既然是张大胖的一个别名–大胖,就不能再让这个别名大胖指代别的人了,不然的话,故人提起大胖,你给我找出一个王大胖?这样不对吧,,,所以我们可以认为引用是指针常量,int * const
1.如果一个引用和一个东西(这里再次使用“东西”这个词)绑定,那么它就永远只能是这个东西的“别名”,不能再说“其他人”的“别名”,即引用本身不能修改。但是,我们可以通过引用来修改它所引用的东西的值。
2.引用声明时必须同时初始化 ,且必须用左值初始化。(左值:就是可以用&求地址的量,换言之,就是有确定地址的量,而不是所谓的临时量)
对这些特性大家是不是似曾相识呢?没错,这些特性和“本身是常量的指针”(int* const p)的特性一样。事实上,我们完全可以借用“本身是常量的指针”来理解甚至定义引用:
引用是一个指向不可变的、被编译器自动解引用的指针,即,引用是一个被编译器自动解引用的“本身是常量的指针”。
看下面的代码
1 | int a = 10; |
*在上面的代码中,编译器将int &ra=a转化为int const ra=&a,而将ra=11转化为* ra=11,将ra自动转化为*ra的过程,就是上面定义中所说的“自动解引用”。**
很显然,const int &ra=a就相当于const int* const ra=&a了。
1 | int aaa = 3; |