C语言的指针与cpp的引用
指针 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]; // 动态内存必须用指针
// ... 使用 arr
delete[] arr;
}
现代C++建议
在现代C++中,通常优先考虑使用引用,除非你需要:
- 处理可选参数(可能为空)
- 进行动态内存管理
- 需要重绑定指向不同的对象
- 与C语言接口交互
引用提供了更安全、更直观的语法,减少了空指针和内存管理的风险。
浙公网安备 33010602011771号