1.指针与引用的区别

前言

 
指针与引用似乎完全不同,前者是某个对象的地址,后者是某个对象的别名,但是功能却似乎一样,都是间接引用其他对象。那么何时用指针何时用引用呢?


空值

 
不存在指向空值的引用,但是存在指向空值的指针。
但可能会有人写出这种程序:

1
char *pc = nullptrchar & rc = *pc;

其结果未定义,在C++的世界里我们不讨论这种无聊且低级的错误。
引用不存在空值,所以必须要初始化,而指针则不用,虽然这样很危险。
引用不存在空值这一特性说明其有效性比指针高,因为我们在指针的使用中总需要判断其非空,但引用则无需如此。


重新赋值

 
指针可以被重新赋值以指向另一个不同的对象。但引用则总是指向在初始化时被指定的对象,无法改变。


在何种情况下使用它们

指针

使用指针的情况是:

  • 可能会不指向任何对象
  • 可能需要改变绑定

引用

使用引用的情况是:

  • 一旦绑定后不再更改
  • 重载某个操作符

假设需要自定义operator[],其功能是返回一个目标对象,其能被赋值:

1
2
vector<int> v(10);
v[5]=10;

如果operator[]返回值不是引用而是指针,则最后一句必须写为 *v[5]=10,这看起来有点像一个数组指针,容易造成不必要的误解。