C++ 引用和指针:& 与 * 的爱恨情仇
2026/8/21大约 2 分钟
C++ 引用和指针:& 与 * 的爱恨情仇
很多人学完指针,又看到 &,直接懵了——这东西到底是地址,还是引用?别急,今天把这两个"长相有点像"的家伙彻底分清楚。
一、先记住一句话
引用是变量的"别名",不是变量本身。
int a = 10;
int &b = a; // b 是 a 的别名
b = 20; // 改 b 就是改 a
std::cout << a << std::endl; // 输出 20b 没有自己的存储空间,它就像一个"贴纸",贴在 a 上。你动贴纸,就是在动 a。
二、引用和指针的区别(重点表格)
| 对比项 | 引用 & | 指针 * |
|---|---|---|
| 本质 | 变量的别名 | 存地址的变量 |
| 能否重新指向 | 不行,定死 | 可以改指向 |
| 能不能为空 | 不能(必须初始化) | 可以是 nullptr |
| 取它的大小 | 就是原变量的大小 | 是指针本身(8 字节) |
| 使用起来 | 直接当变量用 | 要解引用 *p |
三、指针最常见,但引用更省心
// 用指针,要小心解引用和判空
void modify_ptr(int *p) {
if (p) *p = 100;
}
// 用引用,直接用,不用判空
void modify_ref(int &r) {
r = 100;
}引用的好处:不用担心空指针,用起来跟普通变量一样。这也是为什么 C++ 里函数参数传引用那么常见——特别是传大对象的时候:
void print(const std::string &s) {
// const 引用:只读不改,还不用拷贝一份
std::cout << s << std::endl;
}四、什么时候必须用指针?
引用虽然省心,但不是万能的:
- 想重新指向别的对象 → 只能用指针
- 可能没有对象(空) → 只能用指针(
nullptr) - 要放容器里 / 可赋值 → 通常用指针
int a = 1, b = 2;
int *p = &a;
p = &b; // 指针可以换个目标
// int &r = a; r = b; // 这样不是让 r 指向 b,而是把 b 的值赋给 a!五、小结口诀
- 引用 = 别名,指针 = 地址
- 引用不能空、不能换;指针都能
- 传参多用 const 引用,省内存又安全
- 需要"可空""可换"才用指针
记住:能用引用就用引用,必须用指针才用指针。这条经验能帮你少写很多空指针崩掉的 bug。
💬 评论区