C++引用与指针:核心区别与实战解析
一、上期回顾
OOP 三大特性收官:继承、虚函数、动态多态、抽象类、虚析构。今天攻坚引用 & 指针,把 C++ 最核心、面试最爱问的底层区别彻底啃透。
二、引用基础概念
1. 什么是引用
引用就是变量的别名,不开辟新内存,和原变量共用同一块空间。
语法:
int a = 10; int& b = a; // b 是 a 的别名2. 核心特性
- 引用必须初始化,不能空置
- 一旦绑定,不能改指向
- 引用本身无独立内存地址
- 只能绑定同类型变量
三、引用最简演示
#include <iostream> using namespace std; int main() { int a = 10; int& b = a; b = 20; cout << a << endl; // 20,改别名就是改原变量 return 10; }四、引用做函数参数(最常用)
1. 值传递:形参是副本,修改不影响实参
void swapVal(int x, int y) { int t = x; x = y; y = t; }2. 指针传递:靠地址间接修改
void swapPtr(int* x, int* y) { int t = *x; *x = *y; *y = t; }3. 引用传递:直接别名修改,写法干净
void swapRef(int& x, int& y) { int t = x; x = y; y = t; }工程开发优先用引用:简洁、安全、不用解引用。
五、引用做返回值
可以返回引用,可以作为左值被赋值:
int& test(int& a) { return a; } int main() { int x = 10; test(x) = 100; // x 变成 100 return 0; }禁忌:不要返回局部变量引用,局部变量出作用域销毁,引用悬空。
六、指针与引用底层五大区别(面试必背)
表格
| 对比维度 | 指针 Pointer | 引用 Reference |
|---|---|---|
| 内存空间 | 独立开辟内存,存地址 | 无独立内存,别名共用空间 |
| 初始化 | 可不初始化,可置 NULL | 必须初始化,不可为空 |
| 更改指向 | 可以随时改指向别的变量 | 一旦绑定,不可更改指向 |
| 使用方式 | 需要*解引用、->访问成员 | 直接用,像普通变量 |
| 层级 | 支持多级指针int** | 不支持多级引用 |
一句话总结:引用是受限的指针,更安全、更简洁;指针更灵活、可空、可改指向。
七、const 修饰指针与引用(高频坑点)
1. const 修饰普通变量
const int a = 10; // a = 20; 报错,只读2. const 指针三种写法
- 常量指针:指向的值不可改
const int* p;- 指针常量:指针本身地址不可改
int* const p;- 双 const:地址、值都不可改
const int* const p;3. const 引用
常用在函数形参,防止修改原数据:
void show(const int& a) { // a = 100; 报错 }八、内存模型通俗理解
- 指针:单独一块内存,存另一个变量的地址,像 “门牌号”
- 引用:没有门牌号,直接给原房子再起一个名字,共用同一套房
九、今日核心总结
- 引用是变量别名,无独立内存,必须初始化、不可改绑定
- 函数传参:值传副本、指针传地址、引用传别名(最优)
- 引用可做返回值,禁止返回局部变量引用
- 指针灵活可空、可改指向;引用安全简洁不可空
- const 修饰区分:常量指针、指针常量、常引用
十、课后练习
- 分别用 值传递、指针传递、引用传递 实现两数交换
- 写出
const int*和int* const的区别并代码验证 - 尝试返回局部变量引用,观察警告 / 崩溃
