- 指针是存储的是一个地址,它存储的是某一块内存的一个地址,所以可以进行多次赋值操作。
- 但是引用是对某一个内存的另一个别名,他只可以在初始化时进行一次赋值。
- 在任何情况下都不能使用指向空值的引用,但是指针是可以指向NULL的。
char *pc = 0; // 设置指针为空值
char& rc = *pc; // 让引用指向空值
image.png
引用可以指向NULL,但是这是非常糟糕的,希望这辈子都不会遇到这么写的人。
引用必须进行初始化,但是指针可以不进行初始化,虽然指针不初始化是合法的,但是会产生野指针的风险。
由于不能存在指向NULL值的引用,所以不需要对引用的合法性进行校验,所以使用引用的效率是比指针要高的。
指针被赋值之后还可以进行修改,但是引用不可以,引用一旦被初始化完成,那么它只能指向初始化时的对象。
string s1("Nancy");
string s2("Clancy");
string& rs = s1; // rs 引用 s1
string *ps = &s1; // ps 指向 s1
rs = s2; // rs 仍旧引用 s1,
// 但是 s1 的值现在是
// "Clancy"
ps = &s2; // ps 现在指向 s2;
// s1 没有改变
上面的代码说明了,我们可以将指针进行赋值操作,但是对于引用来说,赋值就是将原先引用的对象的值修改为等号右侧的值。