C++ 中引用与指针的异同点详解
一、相同点
间接访问对象
两者均可通过间接方式操作对象,例如修改原值或传递参数时避免拷贝。支持动态内存管理
指针可直接管理动态内存(如new
/delete
),而引用可绑定到动态分配的对象。避免对象拷贝
作为函数参数或返回值时,两者均可避免大对象的拷贝,提升性能。
二、不同点
特性 | 指针 | 引用 | 来源 |
---|---|---|---|
初始化要求 | 可不初始化或设为 nullptr | 必须初始化且不可为空 | |
可修改性 | 可重新指向其他对象 | 一旦绑定后不可更改 | |
空值(Nullability) | 允许 nullptr | 必须绑定有效对象 | |
内存占用 | 占用内存(存储地址) | 不占用额外内存(仅为别名) | |
操作符 | 需解引用(* 或 -> ) | 直接使用(无需解引用) | |
多级间接访问 | 支持(如 int** ) | 仅一级(如 int*& ) | |
参数传递行为 | 传递地址,函数内需解引用 | 隐式传递地址,直接操作原对象 | |
sizeof 结果 | 返回指针本身的大小(如 4/8 字节) | 返回目标对象的大小 | |
安全性 | 可能为野指针,需手动管理 | 更安全(不可空、不可变) |
三、代码示例
初始化与赋值
int a = 10; int* p = &a; // 指针初始化,可指向其他对象 *p = 20; // 解引用修改值 int& r = a; // 引用初始化,不可重新绑定 // r = b; // 错误:r 仍指向 a,实际是 a = b
函数参数传递
void modifyByPointer(int* p) { *p = 100; // 需解引用 } void modifyByReference(int& r) { r = 200; // 直接操作原对象 }
空值与安全性
int* p = nullptr; // 合法 // int& r = nullptr; // 编译错误:引用不能为空
四、使用场景
• 优先使用引用:
• 函数参数传递(避免拷贝)。
• 返回对象(如工厂函数)。
• 需确保对象有效性时(如常量引用)。
• 使用指针:
• 动态内存管理(new
/delete
)。
• 需要重新指向不同对象时(如链表、树)。
• 实现多态(基类指针指向派生类对象)。
五、总结
• 引用:语法简洁、安全,适合绑定固定对象,避免意外修改。
• 指针:灵活强大,但需谨慎管理内存和有效性。
根据需求选择:需要安全性和简洁性时用引用,需要灵活性和控制时用指针。
系统当前共有 449 篇文章