软考传值调用与传引用调用到底怎么区分?形参实参内存模型与函数参数传递底层原理一篇讲透

分类: 软考中级、 软件设计师 发表时间:2026年08月25日 14:51 修改时间:2026年09月11日 23:59 阅读量:5

软考传值调用与传引用调用到底怎么区分?形参实参内存模型与函数参数传递底层原理一篇讲透

在软件设计师、系统架构设计师等软考科目的历年真题中,函数参数传递方式是一类几乎年年出现、却总有人丢分的必考知识点。题目通常给出一段函数调用的定义,让考生判断传值调用与传引用调用两种方式下,输出结果究竟是多少。表面上看这只是一道语言细节题,实际上它考查的是考生对程序运行时内存模型、栈帧结构与变量绑定的理解深度。很多考生靠背结论做题,一旦题目稍加变形就无从下手,根本原因在于没有回到参数传递的底层机制本身。本文从形参与实参的严格定义出发,深入拆解传值调用与传引用调用的内存本质,逐类梳理 C 语言、C++、Java、Python 等主流语言中的参数传递规则,并结合作历年真题分析命题人的挖坑套路,帮助读者彻底掌握这一考点。

一、概念定义:形参、实参与两种传递方式

任何关于参数传递的讨论,都必须先建立在一个精确的概念框架之上。函数定义时写在参数列表里的变量称为形式参数,简称形参;函数调用时实际传入表达式的值称为实际参数,简称实参。形参在函数被调用时才获得内存空间,它是函数体内部可见的局部变量;实参则是调用方提供的、位于调用者上下文中的具体数据。参数传递的核心问题,就是形参如何与实参建立联系:函数内部的形参究竟是实参本身,还是实参的一份拷贝。

传值调用,英文称为 call by value,其语义是:在函数调用发生时,将实参的值复制一份,用这份副本去初始化形参。此后形参与实参在内存中占据两块相互独立的存储单元,函数体内部对形参的一切修改,都只作用于这份副本,而不会触及实参的原始存储单元。当函数返回时,形参随栈帧一起被回收,实参保持不变。这种方式的好处在于数据隔离,调用方可以放心地把自己的变量交给函数使用,不必担心被函数意外篡改;代价则是当实参是一个体积很大的对象时,复制过程会带来时间和空间的开销。

传值调用的适用边界同样值得说明。对于整型、字符型、布尔型等尺寸很小且复制成本几乎可以忽略的基本类型,传值几乎是唯一合理的选择,因为它既简单又安全。但当实参是大数组、大结构体或深嵌套对象时,复制整个数据会消耗可观的时间与内存,传值的效率问题就凸显出来。此时若函数并不需要修改实参,有些语言会提供常量引用或只读引用等机制,在保证不被篡改的同时避免复制;若函数确实需要返回被处理后的数据,则往往改用指针或引用,或让函数通过返回值把新数据带回。可见传值调用的取舍,本质上是在安全性与效率之间寻找平衡。

传引用调用,英文称为 call by reference,其语义是:在函数调用发生时,不是复制实参的值,而是把实参的地址或者说实参的引用传递给形参,使形参成为实参的一个别名。函数体内部对形参的读写,实际上就是通过这个别名直接操作实参所在的存储单元。因此,函数内部对形参的修改会直接反映到实参上,函数返回后实参的值可能已经发生改变。这种方式省去了复制的开销,也使得函数能够对外部变量进行原地修改,但它破坏了数据隔离性,调用方无法确定函数是否修改了自己的变量,这正是所谓副作用风险的来源。

传引用调用还有一个在工程上被广泛使用的价值,就是让函数能够返回多个结果。一个函数只有一个返回值,但借助多个传引用参数,函数可以在修改这些参数的同时,把多份处理结果带回到调用方。例如交换两个变量值、同时返回最大值与最小值、把一个排序动作直接施加到传入的容器上等,都依赖传引用或指针实现的原地修改能力。因此传引用并非只在性能优化时才出现,它更是很多基础算法的标准实现手段,理解这一点有助于考生把参数传递与排序、查找等算法考点贯通起来。

还需要厘清一组容易混淆的术语。软考教材与历年真题中经常同时出现"传值调用""传引用调用""值传递""引用传递""指针传递"等多种说法,考生必须抓住本质来区分,而不能被字面表述牵着走。判断一种传递方式属于传值还是传引用,唯一的标准是"形参的修改是否影响实参"。凡是形参修改不影响实参的,无论形式上看起来多么像引用,本质都是传值;凡是形参修改直接反映到实参的,才是传引用。这一标准贯穿全文,是后续所有分析的总纲。

从考试定位来看,参数传递方式之所以被软考长期青睐,是因为它同时横跨了程序设计语言基础、编译原理、数据结构和软件设计多个知识模块。一道参数传递题,往往需要考生同时调动对变量作用域、存储分配、指针语义和程序执行顺序的理解,具有很强的综合性和区分度。正因如此,这一考点在软件设计师、系统架构设计师、系统分析师等科目的上午选择题中反复出现,在下午的程序设计案例分析中也可能作为求解程序输出的关键步骤。考生若能在备考初期就把参数传递的底层机制彻底吃透,等于一次性打通了多门课程的衔接点,投入产出比极高。

二、原理机制:栈帧、内存拷贝与别名绑定

要真正理解两种传递方式的差异,必须深入到函数调用的运行时机制层面。程序执行时,每当发生一次函数调用,系统都会在调用栈上为这次调用分配一块独立的内存区域,称为栈帧。栈帧中保存着函数的返回地址、局部变量、以及参数等内容。传值调用与传引用调用的本质区别,就体现在形参这块存储单元是如何被初始化的。

传值调用的底层动作:一次纯粹的拷贝

传值调用在底层的动作可以概括为三个字:复制值。当调用方执行函数调用语句时,运行系统先对实参表达式求值,得到一个具体的值,然后把这个值按位或者按类型语义复制到形参所对应的栈存储单元中。对于整数、字符、浮点数这类标量类型,复制的是数值本身;对于结构体这类复合类型,复制的是整个结构体的全部字段。复制完成之后,形参存储单元与实参存储单元之间就不再有任何关联,二者是两个完全独立的内存位置,只是此刻恰好保存着相同的值。

这一机制带来的直接后果是,函数内部对形参做的任何赋值、自增、自减等操作,都只是改变了栈帧里那块副本的内容。调用方的实参存储单元位于调用者的栈帧或堆空间中,与形参的存储单元物理隔离,因此根本不会受到任何影响。用一个通俗的比喻,传值调用就像把一份文件复印了一份交给对方,对方在复印件上涂改得再厉害,原件依然完好如初。这个类比虽然形象,但必须回到技术本质来理解:隔离的根源在于内存拷贝,在于形参与实参是不同的存储单元,而不在于任何人为的约定。

还需要补充一个传值调用中的细节,那就是复制动作发生在函数调用建立栈帧的那一刻,其顺序是先对实参求值、再复制给形参、最后才进入函数体。这就意味着,如果实参表达式带有副作用,例如函数调用或者自增自减运算,那么求值时机也会影响最终结果。软考真题较少在这一层深度上出题,但理解"先求值后复制"的时序,有助于考生在遇到带复合表达式的实参时保持清醒,避免因忽略求值顺序而误算结果。

传引用调用的底层动作:建立别名

传引用调用在底层不做值的复制,而是把实参的存储单元地址传递给函数,让形参直接指向实参所在的那块内存。在支持真正引用语义的语言里,形参并不拥有独立的存储内容,它只是实参这个名字之外的另一个名字,两个名字指向同一块存储单元。函数内部凡是对形参的访问,编译器都会把它翻译成对实参存储单元的间接访问。

因此,函数内部对形参的修改,本质上就是对实参存储单元的修改。函数返回后,实参所在内存的内容已经被改变,调用方再读取实参时看到的就是修改后的新值。回到技术本质,传引用调用的关键在于"别名绑定":形参不是一份数据,而是一个指向数据的指针或者说数据的另一个名字。这一机制的价值有两个方面,一是允许函数原地修改调用方的数据,从而省去复制大对象的开销;二是提供了一种让函数返回多个结果的手段,因为函数可以通过修改多个引用形参来"返回"多个值。

指针参数的本质:地址的值传递

在 C 语言这类只有传值、没有真正引用语义的语言里,人们常常用指针来模拟传引用。这里有一个极其重要的辨析,也是软考命题人最爱挖坑的地方:把指针作为参数传递,本质上仍然是一次传值调用。因为指针变量本身存储的是一个地址值,函数调用时复制的是这个地址值本身,形参指针变量与实参指针变量是两份独立存储、内容相同的指针。从"形参指针变量本身的修改不影响实参指针变量"这一点看,它是标准的传值。

但为什么用指针又能实现修改实参的效果呢?因为形参指针虽然是自己的一份副本,但它保存的地址值指向的是同一个目标存储单元。通过解引用操作符间接访问这个目标单元,就能真正修改到调用方的数据。所以准确的表述是:指针传递在"传递指针本身"这个层面是传值,在"通过指针间接修改所指向对象"这个层面达到了传引用的效果。考生必须分清这两层,否则一遇到"指针参数到底算传值还是传引用"的题目就会混乱。

三、分类与应用:主流语言中的参数传递全景

不同编程语言对参数传

本篇完!

本文为付费内容,请输入 VIP 码查解锁本站全部文章!
点击此处获得 VIP 码
你可能也喜欢这些文章
 

《论信息系统项目的整体管理》核心知识点
08-20
一文读懂架构考试中“必考”的七种操作系统
04-26
JPEG有损压缩原理全解,DCT变换为何能省下90%体积
07-27
海明码纠错原理与校验位计算,一文学透
07-20
《论软件架构风格》适合写什么项目?
11-24
《论软件质量保证及其应用》考点详解?
02-02
香农信息熵公式到底怎么算 信息传输模型信源信宿信道全解析
08-11
25年05月系统架构设计师综合题(16-30题)
09-20
软考网工IP组播怎么学?组播地址、IGMP成员关系与PIM稀疏密集模式一篇讲透
09-06
《论决策支持系统的开发与应用》审题技巧
09-07
软考论文《论软件测试中缺陷管理及其应用》精选试读
01-20
《论区块链技术及应用》适合写什么项目?
01-03
软考CMMI成熟度模型怎么考?五个等级层层拆解,关键过程域与管理体系一篇讲透
06-28
深度解析《论软件的可靠性设计》知识点
11-12
《论模型驱动架构设计方法及其应用》考点详解?
01-19
《论企业应用系统的数据持久层架构设计》适合写什么项目?
12-20
扫码获取 VIP 码
添加管理员微信获取 VIP 码
微信二维码