当前位置: 首页 > news >正文

C++引用与指针:核心区别与实战解析

一、上期回顾

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. 尝试返回局部变量引用,观察警告 / 崩溃
http://www.jsqmd.com/news/739733/

相关文章:

  • OpenTrader开发者进阶指南:深入理解事件驱动架构与策略执行流程
  • 山东五一集训2026
  • 终极指南:如何在Mac上一键解锁QQ音乐加密歌曲,实现真正的音乐自由
  • 如何快速构建REST API集成:Budibase低代码平台终极指南
  • 【稀缺首发】Python 3.15 beta2中未公开的类型系统彩蛋:LiteralString强化、Never类型收敛优化及VS Code 1.96智能补全适配方案
  • 效果展示,Taotoken按Token计费模式如何帮助小项目控制成本
  • 探索RBBAnimation的未来:新特性与路线图展望
  • Elsevier投稿系统Editorial Manager实操:Cover Letter怎么写?审稿人怎么选?
  • Fan Control终极指南:Windows风扇控制软件完美中文显示解决方案
  • 告别经纬度!用Python实战解析国家地球网格标准(附32级编码生成代码)
  • 前端面试终极指南:如何通过用户体验优化赢得大厂Offer
  • 估值超900亿,华为“剥离子”超聚变冲刺A股,算力竞争谁能拔得头筹?
  • 终极指南:5步打造你的专属网易云音乐沉浸式播放界面
  • 从零构建个人开发者主页:Hugo+GitHub Actions+Vercel实战指南
  • C++引用与指针:核心区别全解析
  • 从功能与体验选学习机,五一重护眼、AI、纯净度,兼顾长期价值 - 海淀教育研究小组
  • 【Backend Flow工程实践 18】Clock Tree:为什么时钟网络不是普通 net,而是后端实现的节奏系统?
  • 在Taotoken模型广场中根据任务与预算挑选合适的大模型
  • 如何快速构建企业级表单:JSON Form从基础到实战的完整指南
  • Fui社区生态:如何参与项目开发和获取技术支持
  • Zigbee vs Wi-Fi——两种世界观:同一频段下的不同取舍
  • 信奥赛CSP-J复赛集训(DP专题)(24):出租车拼车
  • 如何快速部署智能交通分析系统:用PyTorch视觉模型库实现高效车辆识别
  • 5G NR里那个默默救场的HARQ,到底是怎么把丢了的包‘拼’回来的?
  • 告别官网!在PyCharm里直接调ChatGPT写代码,这个插件真香(附完整配置流程)
  • 别再手动调动画了!Blender 3.6 自动关键帧与插值曲线实战,5分钟做出丝滑运动
  • 如何快速上手Transitioner:5分钟创建惊艳视图过渡效果
  • 基于Next.js与GraphQL的自建博客系统Letterpad部署与深度定制指南
  • 从内容与教研看学习机,五一选 “真自研”,拒绝碎片化资源 - 海淀教育研究小组
  • 探索IPXWrapper:为现代Windows系统重建经典游戏网络桥梁