C++八股文 | 指针 vs 引用,面试官最爱问的区别全拆解!
👋 学C++的宝子,面试必被问:指针和引用到底哪里不一样?
很多人只背“引用就是别名”,但深挖下去全是坑。
今天用一篇笔记,把底层逻辑 + 核心区别 + 面试话术一次说清,严谨到不怕面试官追问👇
1️⃣ 本质不同(最核心的一句话)
-
指针:是一个对象,它有自己的内存空间,里面存的是另一个对象的地址。
-
引用:不是对象,只是已存在对象的别名,语法上不占独立内存。
🔍 底层验证:
int a = 10;
int *p = &a;
int &ref = a;
sizeof(p) 返回指针的大小(64位系统是8字节),sizeof(ref) 返回的是 a 的大小,引用本身没有内存占用。
2️⃣ 初始化要求
-
指针:可以不初始化(但会成为野指针,极度危险),可以先定义再赋值。
-
引用:必须初始化,且必须绑定到一个合法对象,不允许空引用。
✅ 正确 vs ❌ 错误:
int *p; // 可以,但不推荐
int &ref; // ❌ 编译错误!引用必须初始化
int &ref = a; // ✅ 必须这样
3️⃣ 可否重新绑定(高频考点)
-
指针:可以随时改变指向,指向另一个对象。
-
引用:一旦绑定,终生不能更改,任何赋值都是修改原对象的值。
int x = 1, y = 2;
int *p = &x;
p = &y; // 指针改为指向 y
int &r = x;
r = y; // 不是让 r 引用 y,而是把 y 的值赋给 x,x 变成 2
4️⃣ 空值检查
-
指针:可以为
nullptr,使用前常需要if (p)判空。 -
引用:不存在“空引用”,一般假定一定有效,不用判空,更安全。
👉 这意味着设计函数参数时,用引用能避免空指针异常,是C++推荐的做法。
5️⃣ 多级关系
-
指针:可以有多级指针,如
int **pp;(二级指针)。 -
引用:没有多级引用,不允许
int &&作为二级左值引用(int&&是右值引用,是另一种东西)。
但可以有指针的引用int* &,不能有引用的指针。
6️⃣ 取地址与自增运算
-
指针:
&p拿到指针变量自己的地址;p+1指向下一个元素的地址。 -
引用:
&ref拿到的是原对象的地址;引用本身不能做加减运算。
7️⃣ 作为函数参数(致命的区别!)
这一点面试经常翻车:C++中所有传参默认是值传递。
-
指针传参:把指针的值(地址)复制一份给形参,函数内修改指针指向,不影响外部的实参指针;但可以通过这个地址修改指向的对象。
-
引用传参:传递的是对象的别名,直接操作原对象,无拷贝,且不可为空,真正“所见即所得”。
void change(int *p) {
*p = 20; // 修改所指内容,外部生效
p = new int(30); // 改变局部指针指向,外部指针不变
}
void changeRef(int &r) {
r = 20; // 直接修改原对象
// r 不能重新绑定到其他对象
}
8️⃣ 使用场景一句话总结
-
用指针:需要动态分配内存(new/malloc)、实现多态、可选参数(允许为空)、需要换向时。
-
用引用:函数传参避免拷贝、操作符重载(返回引用)、必须保证有效性的场合。
🎯 面试回答小模板
当面试官问“指针和引用区别”,你可以这样结构化回答:
-
本质:指针是对象存地址,引用是别名不是对象。
-
初始化:引用必须初始化且不可重新绑定,指针可以不初始化且可改向。
-
空值:指针可为 nullptr,引用不可空。
-
内存:sizeof 指针得自身大小,sizeof 引用得所指对象大小。
-
函数传参:指针是值传递地址副本,引用是直接操作原对象。
-
灵活度:指针更灵活(运算、多级),引用更安全。
💡 记住一句话:引用是“安全的受限指针”,指针是“更灵活的内存钥匙”。
需要完整《C++八股文》的小伙伴,可以点击下方传送门
>>2026版C++八股文<<
更多推荐


所有评论(0)