需要预先学习:


1. 语法层面

指针的值是地址,需要通过解引用操作符*来访问指针所指向的对象,而引用是一个已存在变量的别名,可以直接使用引用名来访问变量。

int num = 10;
int* ptr = #
int& ref = num;

std::cout << *ptr << std::endl;
std::cout << ref << std::endl;

2. 资源持有层面

引用天然地不支持更换对象,而指针需要在*后加const修饰才能实现类似语义:

int& ref = num;      // ref 永远绑定 num
ref = num2;          // 这是把 num2 的值赋给 num,而不是让 ref 绑定 num2

// 相当于:
int* const ptr = &num;      // ptr 永远指向 num

3. 内存层面

引用在一些实现中不占用额外的内存空间,而指针是一个变量,会占用一定的内存(4字节或8字节,取决于系统架构)。

有些时候引用底层实现就是指针


4. 关于空值的处理

引用不可以为空,一定要绑定到某个对象上,而指针可以为nullptr,表示不指向任何对象。

int& ref;               // 错误操作,引用必须初始化
int* ptr = nullptr;     // 正确操作,指针可以为空