值传递vs引用传递:这道题我面了十次,每次都有人翻车
上周帮朋友面试来了个硕士应届生985的简历上项目经验挺丰富什么SLAM、路径规划都做过看着挺有底气的。我想先热热身问了个自认为很简单的问题你写一个函数交换两个整数的值怎么写他刷刷刷写完了笔都没停void swap(int a, int b) { int temp a; a b; b temp; }我问他这样写对吗他很自信地说对啊教科书上就是这么写的。我说你调用一下试试。他写了一个测试int x 1, y 2; swap(x, y); cout x y endl;输出是1 2。没交换。他愣住了。讲真这种问题我见过太多次了。不是不会写而是没真正理解值传递和引用传递的区别。教科书上写的swap函数用的是指针不是值传递。值传递复印一份给你值传递说白了就是把参数的副本传给函数。你在栈上开辟一块新空间把原变量的值原封不动地复制过去。函数里怎么折腾这个副本原变量都不受影响。打个比方你有一本书值传递就是我去复印店复印了一本给你。你在上面画花、做笔记我的书还是干干净净的。void modify(int x) { x 100; } int a 10; modify(a); // a还是10这种传递方式安全因为不会意外修改原变量。但有个问题如果参数是个大的数据结构比如一个包含100万个点的点云值传递就要拷贝100万个点性能开销很大。我见过一个实习生写的代码处理激光雷达数据函数参数是值传递的点云对象。每次调用函数都要拷贝一次点云。结果程序跑得特别慢从30fps掉到了8fps。后来改成引用传递帧率立刻恢复了。所以在机器人开发里对于大的数据结构值传递要慎用。引用传递给你起个别名引用传递是C特有的语法相当于给原变量起了个别名。函数里修改引用就是在修改原变量。底层怎么实现的编译器在底层其实是用指针来做的引用就是指针的语法糖。但这个语法糖让代码好读太多了。你不用写*和直接用变量名就行。void modify(int x) { x 100; } int a 10; modify(a); // a现在是100这种传递方式高效因为没有拷贝。但要注意函数内部可能会修改原变量所以要小心。在机器人开发里引用传递用得特别多。比如你要处理一个大的点云数据不想拷贝就用引用传递void processPointCloud(PointCloud cloud) { // 直接修改原数据 }但如果你不想让函数修改原数据就加个constvoid processPointCloud(const PointCloud cloud) { // 只读不能修改 }这样既高效又安全。面试的时候如果你能主动提到const引用面试官会觉得你有工程经验。真的。指针传递 vs 引用传递有什么区别指针传递和引用传递效果类似都能修改原变量。但语法上不一样。指针传递void modify(int* x) { *x 100; } int a 10; modify(a); // 传地址引用传递void modify(int x) { x 100; } int a 10; modify(a); // 直接传变量看起来引用传递更简洁不需要取地址符也不需要用*解引用。但在底层引用传递其实是用指针实现的。编译器帮你做了那些繁琐的语法。面试的时候面试官可能会问引用传递和指针传递有什么区别答案是语法上引用更简洁语义上引用必须绑定到一个有效的变量不能为空而指针可以是nullptr使用上引用一旦绑定就不能改变指向指针可以随便指。在机器人开发里我更喜欢用引用传递因为代码更清晰。但有些场景必须用指针比如参数可能为空的时候。void processSensor(Sensor* sensor) { if (sensor ! nullptr) { // 处理传感器数据 } }这种时候指针就比引用更合适。返回值也是值传递很多人忽略了函数的返回值也是值传递。如果返回的是大数据结构拷贝开销很大。怎么办一种方法是用引用参数代替返回值void getPointCloud(PointCloud cloud) { // 直接填充传入的cloud避免拷贝 }另一种方法是用移动语义C11后面有机会再聊。const引用的威力——只读又高效const引用是C中最实用的参数传递方式没有之一。它结合了值传递的安全性不会修改原变量和引用传递的高效性没有拷贝。void calculateDistance(const Point3D a, const Point3D b) { double dx a.x - b.x; double dy a.y - b.y; double dz a.z - b.z; // a和b都不能被修改编译器会报错 // a.x 0; // 编译错误 }在机器人开发中const引用几乎是标配。你去看PCL、ROS2的源码大数据结构的参数基本都是const引用。面试时候被问为什么不用值传递加const你可以说值传递的const只保护函数内部的副本原变量本来就不会被修改。const引用的const保护的是原变量——这才是有意义的。还有一个容易忽略的点const引用可以绑定到临时对象上而普通引用不行。void print(const std::string s) { cout s endl; } print(hello); // OKconst引用可以绑定到字符串字面量临时对象 void modify(std::string s) { s modified; } // modify(hello); // 编译错误普通引用不能绑定到临时对象这个特性在实际开发中非常有用。比如你的函数需要一个默认参数用const引用就能直接传字面量。面试中的陷阱题面试的时候有些题目特别容易踩坑。比如这个void getString(std::string s) { s modified; } std::string str original; getString(str); cout str endl;输出是什么答案是original。因为参数是值传递函数里修改的是副本。但很多人会想当然地认为是modified。还有这个void modify(std::string s) { s modified; } std::string str original; modify(str); cout str endl;这次输出是modified因为参数是引用传递。这种题目考的就是你对值传递和引用传递的理解。面试的时候一定要看清楚参数是值传递还是引用传递。给正在准备面试的你一点建议值传递和引用传递真的是C最基础的特性之一。但基础的东西往往最容易出错。我面试的时候看候选人写函数第一眼就看参数是怎么传的。如果是大的数据结构用值传递我心里就会打个问号——这个人有没有性能优化的意识怎么提高我的建议是把值传递、引用传递、指针传递的区别搞清楚知道什么时候用哪个。然后去看看开源的机器人代码比如PCL、ROS2看看人家是怎么传参数的。你会发现大的数据结构基本都是const引用只有小的、便宜拷贝的类型才用值传递。最重要的是养成好习惯。大的数据结构用const引用需要修改的时候用引用或指针小的基本类型用值传递。这些习惯一旦养成代码质量和性能都会有提升。对了还有个实用的小技巧写函数的时候先想清楚这个参数需不需要在函数内部修改修改的话调用者需不需要感知到想清楚这两个问题你就知道该用哪种传递方式了。如果这篇文章对你有帮助欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。「机器人软件开发面试·从入门到精通」连载系列上一篇第6篇 函数定义与调用——代码复用的起点 下一篇预告第8篇 递归函数——运动学求解中的常见思路有任何问题欢迎评论区留言我会尽量回复。

相关新闻

AutoRemesher自定义脚本编写:自动化工作流的实现方法

AutoRemesher自定义脚本编写:自动化工作流的实现方法

AutoRemesher自定义脚本编写:自动化工作流的实现方法 【免费下载链接】autoremesher Automatic quad remeshing tool 项目地址: https://gitcode.com/GitHub_Trending/au/autoremesher AutoRemesher是一款强大的跨平台自动四边形网格重拓扑工具,能…

2026/7/11 16:05:10阅读更多 →
2026 AI做歌软件买断版权价格及商用选购指南

2026 AI做歌软件买断版权价格及商用选购指南

很多人找AI做歌工具时,最核心的疑问集中在三点:能不能买断版权商用、不同工具价格差多少、国内日常使用哪款最稳妥。市面上“买断”的概念很容易混淆,有的是买断软件使用权,有的是买断单首作品版权,授权规则的差异直接…

2026/7/11 16:05:10阅读更多 →
革命性图像文本模型diffusiongemma-26B-A4B-it-OptiQ-4bit:如何在Apple Silicon上实现本地高效部署

革命性图像文本模型diffusiongemma-26B-A4B-it-OptiQ-4bit:如何在Apple Silicon上实现本地高效部署

革命性图像文本模型diffusiongemma-26B-A4B-it-OptiQ-4bit:如何在Apple Silicon上实现本地高效部署 【免费下载链接】diffusiongemma-26B-A4B-it-OptiQ-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/diffusiongemma-26B-A4B-it-OptiQ-4bit …

2026/7/11 16:00:09阅读更多 →
CTFHub RCE 7类过滤绕过实战:从无过滤到综合过滤的5种Payload构造

CTFHub RCE 7类过滤绕过实战:从无过滤到综合过滤的5种Payload构造

CTFHub RCE 7类过滤绕过实战:从无过滤到综合过滤的5种Payload构造在网络安全竞赛和渗透测试中,远程命令执行(RCE)漏洞一直是高危漏洞的典型代表。本文将系统性地剖析CTFHub平台上的7类RCE过滤场景,从基础的无过滤环境到复杂的综合过滤机制&am…

2026/7/11 17:00:18阅读更多 →
DiffusionGemma-26B-A4B-it-OptiQ-4bit高级技巧:如何通过LoRA微调定制专属图像文本模型

DiffusionGemma-26B-A4B-it-OptiQ-4bit高级技巧:如何通过LoRA微调定制专属图像文本模型

DiffusionGemma-26B-A4B-it-OptiQ-4bit高级技巧:如何通过LoRA微调定制专属图像文本模型 【免费下载链接】diffusiongemma-26B-A4B-it-OptiQ-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/diffusiongemma-26B-A4B-it-OptiQ-4bit Diffusi…

2026/7/11 17:00:18阅读更多 →
AI大模型:从原理到应用的全面科普

AI大模型:从原理到应用的全面科普

简称为AI大模型的人工智能大模型, 是经大量数据以及强大算力训练进而形成的深度学习模型, 常常有着数十亿甚至数千亿个参数。这类模型在自然语言处理、图像识别、代码生成等领域能展现卓越表现, 成为当下人工智能技术发展的核心方向中的一个。 什么是AI大模型 AI大模型, 本质上…

2026/7/11 17:00:18阅读更多 →
深入解析Linux动态链接:从ELF格式到运行时绑定的核心原理与实践

深入解析Linux动态链接:从ELF格式到运行时绑定的核心原理与实践

1. 项目概述:为什么我们需要动态链接? 在C开发中,尤其是构建大型应用程序或库时,静态链接和动态链接是两种核心的模块组织方式。静态链接简单直接,但它的缺点在项目规模扩大后会变得非常突出:内存浪费、磁盘…

2026/7/11 17:00:18阅读更多 →
Claude Code工程解密:单线程控制流与结构化提示词设计

Claude Code工程解密:单线程控制流与结构化提示词设计

1. 项目概述:为什么 Claude Code 的“顺滑感”无法被简单复制?如果你最近在用 AI 编程助手,大概率已经和 Claude Code 打过交道。它不像某些工具那样一上来就堆砌炫技功能,也不靠密集弹窗和过度解释来营造“我在努力”的假象。相反…

2026/7/11 17:00:18阅读更多 →
AI 辅助开源项目运营:从 Issue 管理到社区增长的系统化方法

AI 辅助开源项目运营:从 Issue 管理到社区增长的系统化方法

AI 辅助开源项目运营:从 Issue 管理到社区增长的系统化方法 一、开源项目最容易失败的地方,不是「代码写得不好」,而是「没有人用、没有人贡献、也没有人维护」 开源项目的运营,和产品的运营有很多相似之处:都需要明确…

2026/7/11 16:55:17阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/10 12:10:00阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/11 15:18:12阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/11 15:11:32阅读更多 →
Premiere Pro 2025安装失败原因与AGSIS验证绕过指南

Premiere Pro 2025安装失败原因与AGSIS验证绕过指南

1. 为什么2025版PR安装比以往更“磨人”?——从弹窗警告到路径陷阱的真实处境 Premiere Pro 2025版不是简单的一次版本迭代,它是一道分水岭。我从去年底开始帮影视工作室、高校剪辑实验室和自由职业者部署2025环境,累计处理了137台设备&#…

2026/7/11 0:03:43阅读更多 →
5款实用macOS系统优化工具:让你的Mac运行更流畅更高效

5款实用macOS系统优化工具:让你的Mac运行更流畅更高效

5款实用macOS系统优化工具:让你的Mac运行更流畅更高效 【免费下载链接】open-source-mac-os-apps 🚀 Awesome list of open source applications for macOS. https://t.me/s/opensourcemacosapps 项目地址: https://gitcode.com/gh_mirrors/op/open-so…

2026/7/11 0:03:43阅读更多 →
5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

2026/7/11 0:03:43阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/11 16:20:28阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/10 22:20:33阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/10 17:29:22阅读更多 →