C++ 引用vs 指针
外观
C++引用VS指针[编辑 | 编辑源代码]
介绍[编辑 | 编辑源代码]
在C++中,引用(Reference)和指针(Pointer)都是间接访问变量的机制,但它们有不同的语法、行为和使用场景。理解它们的区别对于编写高效、安全的C++代码至关重要。
- 引用是变量的别名,必须在声明时初始化,且不能重新绑定到其他变量。
- 指针是一个存储内存地址的变量,可以重新指向不同的地址,也可以为`nullptr`。
基本语法对比[编辑 | 编辑源代码]
引用[编辑 | 编辑源代码]
int x = 10;
int& ref = x; // ref是x的引用
ref = 20; // 修改ref等同于修改x
指针[编辑 | 编辑源代码]
int x = 10;
int* ptr = &x; // ptr存储x的地址
*ptr = 20; // 通过指针修改x的值
ptr = nullptr; // 指针可以置空
关键区别[编辑 | 编辑源代码]
特性 | 引用 | 指针 |
---|---|---|
必须初始化 | 可以不初始化 | ||
不能重新绑定 | 可以重新指向 | ||
不能为`nullptr` | 可以为`nullptr` | ||
通常不占用额外内存(编译器优化) | 占用指针大小的内存(如4/8字节) | ||
自动解引用 | 需显式使用`*`或`->` |
内存模型[编辑 | 编辑源代码]
实际应用场景[编辑 | 编辑源代码]
函数参数传递[编辑 | 编辑源代码]
引用更安全,适合不需要重新绑定的场景:
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
指针更灵活,适合可能为空的场景:
void print(int* ptr) {
if (ptr) cout << *ptr; // 检查空指针
}
返回值优化[编辑 | 编辑源代码]
引用常用于运算符重载:
class Vector {
int data[100];
public:
int& operator[](size_t index) {
return data[index];
}
};
高级主题[编辑 | 编辑源代码]
引用折叠(C++11)[编辑 | 编辑源代码]
在模板和`auto`推导中涉及引用折叠规则:
指针算术[编辑 | 编辑源代码]
指针支持算术运算,引用不支持:
int arr[3] = {1, 2, 3};
int* p = arr;
p++; // 指向arr[1]
性能考虑[编辑 | 编辑源代码]
在大多数情况下,引用和指针的底层实现相同,但引用:
- 可能被编译器优化掉
- 没有空值检查开销
- 语法更简洁
总结[编辑 | 编辑源代码]
- 优先使用引用:当不需要重新绑定/null语义时
- 必须使用指针:当需要动态内存管理或可选参数时
- 现代C++中,引用和智能指针(如`std::unique_ptr`)的组合可以替代许多原始指针的使用场景