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

【C++】015、函数参数:值传递,指针传递,引用传递的区别

一、本质区别

1、值传递是赋值粘贴,函数内获取的副本,不影响外部

2、指针传递的是“邮寄地址”,可通过地址间接修改外部对象

3、引用传递的是别名绑定,可直接操作原对象

二、比对

对比维度

值传递

指针传递

引用传递

传递内容

实参的副本(全新拷贝)

实参地址(拷贝地址值)

实参的别名(底层也是地址)

能否修改外部实参

不能(改的是副本)

能(通过解引用*ptr)

能(直接操作原对象)

内存开销

打(拷贝整个对象)

小(拷贝8字节地址)

空值(null)风险

有(空指针需判断空)

无(引用必须事先绑定对象)

  • 代码:

#include <iostream> #include <string> // 1. 值传递:改的是副本 void byValue(std::string s) { s += "_copy"; // 只影响局部副本 } // 2. 指针传递:通过地址修改原对象 void byPointer(std::string* s) { if (s) { // 必须判空! *s += "_ptr"; } } // 3. 引用传递:直接修改原对象 void byReference(std::string& s) { s += "_ref"; } int main() { std::string str = "Hello"; byValue(str); std::cout << str << std::endl; // 输出 "Hello"(未变) byPointer(&str); std::cout << str << std::endl; // 输出 "Hello_ptr" byReference(str); std::cout << str << std::endl; // 输出 "Hello_ptr_ref" }

三、引用使用场景

1、需要修改实参

void swap(int& a, int& b) { int tmp = a; a = b; b = tmp; }

2、传递大对象,只读不写使用const引用

void printVector(const std::vector<int>& v) { // 避免拷贝百万个元素 for (int x : v) std::cout << x; }

3、保留派生类信息,实现多态

class Animal { virtual void speak(){} }; class Cat : public Animal { void speak() override {} }; void play(Animal& a) { a.speak(); } // 传 Cat 也能正确调用 Cat::speak()

4、运算符重载

int& operator[](size_t idx) { return data[idx]; }

四、使用指针的场景

1、参数可选,可能为空

2、需要动态改变指针指向的对象

  • 指针可指向另外的对象地址,而引用不允许

3、与C语言交互,C语言没有引用,使用指针传递(void*)

http://www.jsqmd.com/news/1144941/

相关文章:

  • 方差(实例实操、与标准差的区别)
  • Windows 11 云重建功能实测:无需U盘也能从云端恢复系统
  • 梅开二度,这次拿下系统分析师
  • 调试问题总结
  • 电玩城测评 3 种拳击机器人:海岸城实测,为什么有的只热闹一阵,有的能拉起 PK 复玩
  • SystemC:内核回调函数
  • 会计岗位智能报税和对账用哪款Agent?主流企业级智能体选型与技术解析
  • 研究生招生国家分数线 API 接口
  • 我同时用了 Claude Code、Cursor 和 Codex,说说三个工具的真实差距——2026 年选错工具比不用 AI 更浪费时间
  • 倒置荧光显微镜LF200-类器官与器官芯片:生命科学的前沿窗口
  • 长沙阳台推拉门怎么选?不卡顿、不漏水、隔音好,照着选就对了
  • S32K14X CAN
  • 我给 AI 提了个小需求,它帮我“重构“了整个系统——AI 编程范围失控怎么办?
  • 深度解密大模型 Agent 的终极银弹:Browser(浏览器沙箱)操作全指引与检索降级闭环
  • 自动调整学习率
  • LangGraph 工作流:普通开发者先补哪三块
  • 直线电机在3D打印中的精密运动控制应用与优化实践
  • AI知识库技术:构建个人B站视频检索系统的实践指南
  • Napping: 1.0.1靶场攻略
  • 系统日志智能分析和数据库自动备份怎么做?从工程实践到企业级智能自动化选型建议
  • Oracle 11g RAC 多路径配置总搞不定?iSCSI + Multipath + ASM 磁盘组,14节视频带你完整通关
  • 阿里云 OPC 创业平台:从零搭建 OpenClaw AI Agent 完全实战手册
  • MateClaw 1.7.0 开源发布,企业级JAVA龙虾平台,支持员工、看板、WIKI知识库、技能和审计,Spring AI 最佳实践
  • 销售线索自动跟进和商机管理能用AI吗?——2026企业级AI Agent落地深度测评
  • 基于HarmonyOS的情侣美食管理应用开发实战(三)- 美食相册与设置功能
  • 【OpenHarmony/HarmonyOs 】从化学学习 App 出发:近场快传、实况窗与全场景智慧学习方案
  • 《凌微经》通读:论“透过现象看本质”与“把握本质辨现象”的理论实践之统一
  • 设备机箱定制厂家如何提升客户满意度
  • 存储碎片化难以根治?深度解析 PowerFS 真正的协议无关存储底层设计
  • 如何在openEuler上快速部署Marvell QLogic FC HBA驱动:qla2xxx安装教程