引用并不仅仅是用来替换指针的功能,它在C++中的原义并不是想让程序员认为
它是指针的代替品,尽管在底层它是用指针的方式来实现。
但是我们应该注意到,指针可以为NULL,甚至可以指向一个非法地址,而这些
错误编译器根本就无法捕获,只有当程序运行时才可能觉察。比如下面的语句:
int *p=NULL;
*p=0;
编译器不会报错,但是运行时必然崩溃。
对于引用,我们应该从C++的语义上理解,而不应该从它的底层实现去看,引用
应该看作某个变量的别名。比如:
int a,&r=a;
r=0;
这里的引用r被看作a的别名,而不仅仅理解为取a的地址,引用只能引用一个已存在
的变量,而且申明一个引用的同时必须让它引用一个变量,所以不会出现象指针那样
指向非法地址的错误。比如:
int *p; //OK
int &r; //Fault,没有引用变量
int *&rp=p; //OK,rp是指针p的引用(或者别名)
int &*p=&r; //Fault,引用的指针,对引用取址毫无意义。
引用r只是一个别名,并不是真实的变量,编译器不会为r分配内存,对r取地址也就毫
无意义。