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

指针与引用参数传递的区别及内存操作流程详解

指针和引用都是C++中用于间接访问变量的机制,但在参数传递时它们的工作方式和内存操作流程有所不同。

1. 基本概念

指针 (Pointer)

  • 是一个变量,存储的是另一个变量的内存地址

  • 可以重新指向不同的地址

  • 可以为nullptr

引用 (Reference)

  • 是已存在变量的别名

  • 必须在初始化时绑定到一个变量,之后不能改变

  • 不能为null

2. 参数传递时的内存操作流程

指针参数传递示例

 

void modifyWithPointer(int* ptr) {*ptr = 20;  // 解引用并修改值
}int main() {int a = 10;modifyWithPointer(&a);  // 传递a的地址// a现在为20
}

内存操作流程:

  1. 在main函数中,变量a被创建在栈上,地址为0x1000,值为10

  2. 调用modifyWithPointer时,创建指针参数ptr,ptr本身位于新栈帧中(地址0x2000),存储的值是a的地址0x1000

  3. 通过*ptr解引用,实际修改的是0x1000地址处的值

  4. 函数返回后,ptr被销毁,但a的值已被修改

引用参数传递示例

 

void modifyWithReference(int& ref) {ref = 30;  // 直接操作引用
}int main() {int b = 10;modifyWithReference(b);  // 传递b的引用// b现在为30
}
 

内存操作流程:

  1. 在main函数中,变量b被创建在栈上,地址为0x3000,值为10

  2. 调用modifyWithReference时,引用参数ref被创建为b的别名,不占用额外存储空间(编译器实现可能不同)

  3. 操作ref等同于直接操作b的内存(0x3000)

  4. 函数返回后,b的值已被修改

3. 关键区别

特性指针引用
内存占用需要存储地址(通常4/8字节)通常不占用额外内存(编译器优化)
语法需要解引用(*)操作直接使用,像普通变量
可空性可以为nullptr不能为null
重绑定可以指向不同地址一旦绑定不能改变
参数传递传递地址(&变量)直接传递变量
内存操作层次需要访问指针值和解引用两次操作直接操作原始变量

4. 底层视角

在汇编层面,引用通常是通过指针实现的,但编译器会保证引用不为空且不被重新绑定。引用提供了更高级别的抽象和安全性。

5. 使用建议

  • 需要"无"值或需要重新绑定时使用指针

  • 需要更安全、更直观的语法时使用引用

  • 需要操作动态分配的内存时必须使用指针

  • 在C++中,引用通常更受欢迎,除非有特定需要使用指针

理解这些区别有助于写出更高效、更安全的代码,特别是在处理大型对象或需要修改调用者变量时。

http://www.xdnf.cn/news/970651.html

相关文章:

  • 分散电站,集中掌控,安科瑞光伏云平台助力企业绿色转型
  • 高通录像功能
  • Vim 光标移动命令总览
  • Java中高并发线程池的相关面试题详解
  • 《ZLMediaKit 全流程实战:从部署到 API 调用与前后端集成》
  • 用 LoRA 对 Qwen2.5-VL 模型进行SFT - FORCE_TORCHRUN=1
  • 条件运算符
  • error: src refspec master does not match any - Git
  • coze的基本使用
  • 从零开始搭建现代化 Monorepo 开发模板:TypeScript + Rollup + Jest + 持续集成完整指南
  • Git操作问题及解决方案-记录5
  • (十)学生端搭建
  • 【SQL学习笔记3】深入理解窗口函数的用法
  • 鹰盾加密器系统黑屏问题的深度解析与处理机制
  • RAG系统向量数据库选型与Prompt Engineering鲁棒性测试实践
  • 10:00开始面试,10:06就出来了,问的问题有点变态。。。
  • 第14篇:数据库中间件的分布式配置与动态路由规则热加载机制
  • vxe-table 如何实现直接渲染输入框控件,不需要点击编辑方式,直接就显示文本框
  • DSL查询文档
  • Android OpenSL ES 音频播放完整实现指南
  • AtCoder Beginner Contest 408
  • 电路笔记(元器件):并串转换芯片 SN65LV1023A 10:1 LVDS 串行器/解串器变送器 100 至 660Mbps
  • HarmonyOS开发:设备管理使用详解
  • shell脚本总结15:grep命令的使用方法
  • 不变性(Immutability)模式
  • 丝路幽径:穿梭于Linux多线程控制的秘境
  • 专题一_双指针_快乐数
  • LeetCode 3442.奇偶频次间的最大差值 I:计数
  • 使用分级同态加密防御梯度泄漏
  • Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:智驿AI系统(前后端源码 + 数据库 sql 脚本)