一、上期回顾

OOP 三大特性收官:继承、虚函数、动态多态、抽象类、虚析构。今天攻坚 引用 & 指针,把 C++ 最核心、面试最爱问的底层区别彻底啃透。


二、引用基础概念

1. 什么是引用

引用就是变量的别名,不开辟新内存,和原变量共用同一块空间。

语法:

int a = 10;
int& b = a;   // b 是 a 的别名

2. 核心特性

  1. 引用必须初始化,不能空置
  2. 一旦绑定,不能改指向
  3. 引用本身无独立内存地址
  4. 只能绑定同类型变量

三、引用最简演示

#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 指针三种写法

  1. 常量指针:指向的值不可改

const int* p;
  1. 指针常量:指针本身地址不可改

int* const p;
  1. 双 const:地址、值都不可改

const int* const p;

3. const 引用

常用在函数形参,防止修改原数据:

void show(const int& a)
{
    // a = 100; 报错
}

八、内存模型通俗理解

  • 指针:单独一块内存,存另一个变量的地址,像 “门牌号”
  • 引用:没有门牌号,直接给原房子再起一个名字,共用同一套房

九、今日核心总结

  1. 引用是变量别名,无独立内存,必须初始化、不可改绑定
  2. 函数传参:值传副本、指针传地址、引用传别名(最优)
  3. 引用可做返回值,禁止返回局部变量引用
  4. 指针灵活可空、可改指向;引用安全简洁不可空
  5. const 修饰区分:常量指针、指针常量、常引用

十、课后练习

  1. 分别用 值传递、指针传递、引用传递 实现两数交换
  2. 写出 const int*int* const 的区别并代码验证
  3. 尝试返回局部变量引用,观察警告 / 崩溃

更多推荐