👋 学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)、实现多态、可选参数(允许为空)、需要换向时。

  • 引用:函数传参避免拷贝、操作符重载(返回引用)、必须保证有效性的场合。


🎯 面试回答小模板

当面试官问“指针和引用区别”,你可以这样结构化回答:

  1. 本质:指针是对象存地址,引用是别名不是对象。

  2. 初始化:引用必须初始化且不可重新绑定,指针可以不初始化且可改向。

  3. 空值:指针可为 nullptr,引用不可空。

  4. 内存:sizeof 指针得自身大小,sizeof 引用得所指对象大小。

  5. 函数传参:指针是值传递地址副本,引用是直接操作原对象。

  6. 灵活度:指针更灵活(运算、多级),引用更安全。


💡 记住一句话:引用是“安全的受限指针”,指针是“更灵活的内存钥匙”

需要完整《C++八股文》的小伙伴,可以点击下方传送门

>>2026版C++八股文<<

更多推荐