指针 vs 引用 的相似之处
共同特点:
- 都是间接访问:都提供了对另一个对象/变量的间接访问
- 都避免拷贝:传递大型对象时都可以避免昂贵的拷贝操作
- 都能修改原对象:通过指针或引用都可以修改所指向的对象
具体代码对比
#include <iostream>
using namespace std;void pointerExample() {int value = 10;int* ptr = &value; // 指针int& ref = value; // 引用cout << "原始值: " << value << endl;*ptr = 20; // 通过指针修改cout << "指针修改后: " << value << endl;ref = 30; // 通过引用修改cout << "引用修改后: " << value << endl;
}void functionParameters() {// 指针作为参数void updateWithPointer(int* ptr) {if (ptr) *ptr = 100;}// 引用作为参数void updateWithReference(int& ref) {ref = 200;}int num = 5;updateWithPointer(&num); // 需要取地址updateWithReference(num); // 直接传递变量
}
主要区别
特性 | 指针 | 引用 |
---|---|---|
语法 | *ptr , &var |
&ref , 直接使用 |
空值 | 可以为 nullptr |
必须初始化,不能为空 |
重绑定 | 可以指向不同对象 | 一旦绑定不能改变 |
内存占用 | 有自己的内存地址 | 是别名,不占额外内存 |
数组 | 支持指针算术 | 不能重新绑定 |
使用场景
// 推荐使用引用的场景
void processString(string& str) { // 修改原字符串str += " processed";
}void printObject(const Object& obj) { // 避免拷贝,只读访问cout << obj << endl;
}// 推荐使用指针的场景
void optionalParameter(int* optional = nullptr) {if (optional) {*optional = 42;}
}void dynamicAllocation() {int* arr = new int[100]; // 动态内存必须用指针// ... 使用 arrdelete[] arr;
}
现代C++建议
在现代C++中,通常优先考虑使用引用,除非你需要:
- 处理可选参数(可能为空)
- 进行动态内存管理
- 需要重绑定指向不同的对象
- 与C语言接口交互
引用提供了更安全、更直观的语法,减少了空指针和内存管理的风险。