C++ 入门学习经验 05——指针(一):从交换变量开始,搞懂值传递、指针和引用
📅 2026/7/14 18:35:50
👁️ 次浏览
大家好啊这里是土豆的博客一个正在努力学习技术的大学生。前面两篇我们聊了递归也用几个例子看到了有时候代码只是顺序换了一下结果就完全不一样。那今天这篇咱们来聊另一个很多初学者都会遇到的问题为什么我在函数里面明明改了变量回到主函数里却一点变化都没有这个问题其实特别适合用来引出 C 里面几个很重要的概念值传递、指针和引用。这几个东西刚开始看确实容易绕但只要从“函数到底拿到的是什么”这个角度去理解就会清楚很多。好了废话不多说咱们直接开始。简单案例交换函数我们先看一段代码。你觉得它会输出什么#include iostream using namespace std; void swap(int a, int b) { int temp a; a b; b temp; } int main() { int x 3, y 5; swap(x, y); cout x y endl; // 期待输出 5 3 ? return 0; }先暂停一下自己想一想。运行结果其实是3 5—— 完全没有交换。怎么回事明明 swap 函数里已经交换了a 和 b为什么外面的 x 和 y 没变这就要引出初学者最容易踩的第一个坑值传递。下面我们就开始讲讲要怎么理解这部分内容值传递函数里的变量是“复印件”在 C 里如果我们直接把变量传给函数比如swap(x, y)函数里面的a和b并不是原来的x和y而是它们的副本。可以这样理解你把一份资料复印给别人别人把复印件改得再多也不会影响你手里的原件。所以刚才那段代码真正发生的过程大概是这样main里面有两个变量x 3y 5。调用swap(x, y)时把x和y的值复制了一份分别给了a和b。函数里面交换的是a和b这两个副本。函数结束后a和b被销毁。原来的x和y从头到尾都没有被改过。所以这就是我们常说的函数里改了外面却没变。那如果我就是想让函数真的改到外面的变量该怎么办呢很自然的想法就是不要只给函数一份复印件而是告诉它原变量在哪里。这就引出了指针。指针保存地址的变量指针这个词刚听起来可能有点抽象但先不用想得太复杂。咱们可以先记住一句话指针就是用来保存地址的变量。比如int x 10; int* p x;这里有两个符号需要注意x表示取出变量x的地址。int* p表示p是一个指针变量它里面存的是一个int类型变量的地址。那既然p里面存着x的地址我们就可以通过p找到x这一步叫解引用cout *p endl; // 输出 10这里的*p就可以理解成顺着 p 里面保存的地址找到那个变量的值。所以如果要真正交换两个变量就可以把变量的地址传进函数void swapByPointer(int* a, int* b) { int temp *a; *a *b; *b temp; } int main() { int x 3, y 5; swapByPointer(x, y); cout x y endl; return 0; }这次输出就是5 3因为函数拿到的不再是x和y的复印件而是它们的地址。函数通过地址找到了原变量所以修改就真的生效了。不过大家可能也发现了指针写起来会多一些*和刚开始很容易看晕。那有没有一种写法既能改到原变量又看起来更像普通变量呢有这就是引用。引用给变量起一个“别名”引用可以简单理解成给一个变量起了另一个名字。比如int x 10; int ref x; ref 20; cout x endl; // 输出 20这里ref是x的引用也就是x的别名。我们修改ref其实就是在改x。所以交换两个变量时也可以这样写void swapByReference(int a, int b) { int temp a; a b; b temp; } int main() { int x 3, y 5; swapByReference(x, y); cout x y endl; return 0; }这次同样会输出5 3引用的好处就是调用的时候很自然还是直接写swapByReference(x, y)但是函数内部拿到的不是副本而是原变量的别名。所以我觉得初学的时候可以这样记值传递看成复印件指针 地址引用 别名。三种方式简单对比为了方便理解咱们放在一起看一下方式函数参数写法调用时写法能不能改外面的变量值传递int afunc(x)不能指针传递int* afunc(x)能引用传递int afunc(x)能这里最容易混的地方就是两个在int ref x;里面表示引用。在x里面表示取地址。它们长得一样但出现在不同位置时意思是不一样的。这个刚开始不用死记硬背多看几段代码就会慢慢熟悉。指针和引用还有一个重要区别引用和指针都能让函数改到外面的变量但它们并不完全一样。引用一般定义时就要绑定到一个变量并且后面不能再改成引用别的变量int x 10, y 20; int ref x; ref y; // 这不是让 ref 改绑到 y而是把 y 的值赋给 x而指针就更灵活一点它可以先指向x后面再指向y也可以指向空int x 10, y 20; int* p x; p y; p nullptr;所以简单来说引用更像固定的别名用起来简洁。指针更像可以改变方向的地址变量更灵活但也更需要小心。至于什么时候用指针什么时候用引用这个后面结合数组、函数返回值、动态内存的时候会更好理解。今天先把最基础的概念弄清楚就行。写在最后今天咱们从一个简单交换函数的例子入手搞清楚了值传递类比复印件不改原件。指针传递传地址能改原件但写法稍复杂。引用传递别名能改原件写法简洁。所以只是参数的形式换一下——加个或*结果就不一样了。后面我们会继续聊数组与指针的关系、动态内存分配等等。如果你对指针还觉得晕没关系多练习写几遍自然就熟了。如果这篇文章对你有帮助麻烦点赞、关注和收藏吧谢谢有什么问题或者想法欢迎在评论区留言我们一起交流我们下篇见
更多请点击:
https://intelliparadigm.com
第一章:Figma AI转代码的本质:一场前端工程范式的静默革命 Figma AI转代码并非简单的“设计图→HTML”映射工具,而是将UI设计语言、组件语义与前端工程约束深度融合的智能编译器。它背后…
📅 2026/7/14 18:35:50
2018年10月,对于狮子座来说,那真是一段让人至今想起都忍不住想叹气的日子。那时候,我总觉得自己的能量被某种看不见的东西死死压制住了。不是那种暴力的压制,而是像湿冷的雾气,慢慢渗透进骨头缝里。2018年10月狮子座geo这个概念,现在听起来可能有点玄乎。但在当时,它实实…
📅 2026/7/14 18:35:08
更多请点击:
https://intelliparadigm.com
第一章:企业级AI商业头脑风暴的核心价值与战略定位 企业级AI商业头脑风暴并非简单的创意聚会,而是将人工智能能力深度嵌入战略决策闭环的关键枢纽。它通过结构化协同机制,将业务痛点、数…
📅 2026/7/14 18:34:49
在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括失业保险信息管理系统的网络应用,在国外失业保险信息管理已经是很普遍的方式,不过国内的失业保险信息管理可能还处于起步阶段。失业保险信息管理系统具…
📅 2026/7/14 19:27:58
如果你正在找一个“看起来不水、写论文也有内容”的系统类选题,智能物流管理系统其实挺值得考虑。它不像普通信息管理系统那样太泛,也不像深度算法项目那样上手门槛很高,属于功能能讲清楚、论文也比较容易展开的方向。
这次分享的是ÿ…
📅 2026/7/14 19:27:58
1. COUNT函数的本质与常见写法当你第一次接触SQL时,COUNT函数可能是最早学会的聚合函数之一。这个看似简单的函数背后,却藏着不少值得深究的细节。让我们先来看看最常见的三种写法:SELECT COUNT(*) FROM users;
SELECT COUNT(1) FROM users; …
📅 2026/7/14 19:27:58
一、数据分析工具的"三层地图"
企业的数据分析需求通常不是从零开始的,而是沿着一条可预测的路径逐步升级:从解决单点问题("帮我把这堆数据整理一下"),到建立日常分析体系("每天…
📅 2026/7/14 19:27:58
第五届智能机械与人机交互技术国际学术会议(IHCIT 2026)将定于2026年8月21-23日在中国成都召开,大会面向基础与前沿、学科与产业,旨在将“人工智能”、“机械工程”、“智能系统”、“人机交互”等学术领域的学者、专家、研发者、…
📅 2026/7/14 19:27:58
核心要点:必须掌握的三大基石要成为一名中级Flink分析师,有三个核心必须吃透:有状态流处理、精确一次(Exactly-Once)语义和时间语义。有状态流处理:这是Flink的“灵魂”。区别于无状态的简单ETL,…
📅 2026/7/14 19:26:58
从“创始人投影”到“真理映射”——大语言模型认知本质的哲学批判与范式重构
摘要
当前全球主流大语言模型(LLMs)在技术指标上持续突破,却在认知本质上陷入了一种根本性的“搞反”状态:它们本应成为人类超越自身认知局限的“传…
📅 2026/7/14 0:00:05
Hadoop 3.2.2 JDK 21 Windows开发环境全流程实战指南对于需要在Windows环境下进行大数据开发的Java/Scala开发者来说,搭建一个本地Hadoop开发环境是入门的第一步。本文将带你从零开始,完成Hadoop 3.2.2与JDK 21的环境搭建,并实现一个完整的M…
📅 2026/7/14 0:00:05
1. 项目概述:为什么你需要Boost库? 如果你用C写过一些项目,尤其是涉及到网络、并发、文件系统或者需要处理一些复杂数据结构时,大概率会听过或者用过Boost库。它不是C标准库的一部分,但它在C社区的地位,几…
📅 2026/7/14 0:00:05
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/14 6:35:02
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/14 12:06:52
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/14 7:15:18
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/14 15:11:56
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/13 19:47:36
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/14 15:11:56