C++基础系列【18】引用和指针的区别
博主介绍:程序喵大人
- 35- 资深C/C++/Rust/Android/iOS客户端开发
- 10年大厂工作经验
- 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
- 《C++20高级编程》《C++23高级编程》等多本书籍著译者
- 更多原创精品文章,首发gzh,见文末
- 👇👇记得订阅专栏,以防走丢👇👇
😃C++基础系列专栏
😃C语言基础系列
😃C++大佬养成攻略
首先要了解引用的本质。
汇编代码
先看这段源代码:
#include <iostream>
int main() {
int x = 10;
int& ref = x; // 编译器处理为 int* const ref = &x;
ref = 20; // 等价于 *ref = 20;
int* ptr = &x;
*ptr = 30;
return 0;
}
代码中有两段类似的代码,一个使用的引用,一个使用的指针。我们看下它们生成的汇编代码,如图(https://godbolt.org/z/cYTov86G6):
这里可以看到,两者生成的汇编代码除了数字,其他完全相同。
因为引用本质上是通过常量指针实现的。
核心区别
特性 | 引用 | 指针 |
---|---|---|
初始化要求 | 必须初始化,且不可重新绑定到其他对象 | 可以声明为空指针(nullptr ),后续可修改指向 |
空值合法性 | 不允许空引用 | 允许空指针(nullptr ) |
内存占用 | 不占用显式内存(编译器优化) | 占用独立内存(存储地址值) |
操作语法 | 直接使用对象语法(无 * 或 -> ) | 需用 * 解引用或 -> 访问成员 |
类型安全性 | 强类型绑定,无类型转换风险 | 允许 void* 和危险的类型转换 |
多级间接访问 | 仅支持单层引用(无引用的引用) | 支持多级指针(int** ) |
内存地址可见性 | 无法直接获取引用的地址(&ref 返回原对象地址) | 可直接获取指针变量的地址(&ptr ) |
实践经验
- 优先使用引用的场景:函数参数传递、运算符重载。
- 必须使用指针的场景:动态内存管理、低级内存操作、需要空值或重新绑定的场景。
误区
引用是安全的吗?
其实也没那么安全,引用本质上仍依赖对象的有效性。如果引用绑定到已释放的内存,行为未定义(和悬垂指针一样危险):
int* x = new int(10);
int& ref = *x;
delete x; // 后续使用 ref 会导致未定义行为
码字不易,欢迎大家点赞,关注,评论,谢谢!
C++训练营
专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得offer!训练营介绍