指针和引用的区别
指针和引用是C++中用于间接访问变量的两种机制,看似相似但本质差异显著,理解这些差异对内存管理和程序稳定性至关重要。
从初始化来看,引用在定义时必须初始化,且一旦初始化就不能再指向其他对象,相当于“别名”;而指针可以在定义时不初始化,后续也能改变指向的对象,甚至可以指向空(nullptr)。例如:
int a = 10;
int& ref = a; // 正确,引用必须初始化
int* ptr; // 正确,指针可延迟初始化
ptr = &a; // 指针指向a
指针可以为nullptr,而引用不存在“空引用”,这是两者在安全性上的核心区别。使用指针时需先检查是否为nullptr以避免空指针异常,而引用无需此类检查,但使用未初始化的引用会导致未定义行为。
在可修改性方面,引用的指向不可更改,一旦绑定某个对象,就始终代表该对象;指针则可以随时改变指向,指向另一个同类型对象。例如:
int a = 10, b = 20;
int& ref = a;
ref = b; // 实际是将b的值赋给a,而非ref指向b
int* ptr = &a;
ptr = &b; // 指针现在指向b,正确
sizeof操作的结果不同:sizeof(指针)返回的是指针本身的大小(通常为4或8字节,取决于系统位数);而sizeof(引用)返回的是被引用对象的大小。例如: