传值调用和引用调用的基础知识是软件评测师考试的重要考点,基本上每年分数占比1-2分,经常出现在上午场的客观选择题当中。当在一个函数(称为主调函数)中需要使用另一个函数(称为被调函数)实现的功能时,便以名字进行调用,称为函数调用。函数调用根据参数传递方式分为:传值调用、引用调用。下面就该知识点并结合例题进行总结学习。
一、函数调用概述
在使用一个函数时,只要知道如何调用就可以了,并不需要关心被调用函数的内部实现。因此,主调函数需要知道被调函数的名字、返回值和需要向被调函数传递的参数(个数、类型、顺序)等信息。
函数调用的一般形式为:函数名(实参表);
在C程序的执行过程中,通过函数调用实现了函数定义时描述的功能。函数体中若调用自己,则称为递归调用。
二、函数调用分类
函数调用时实参与形参间交换信息的方法有传值调用和引用调用两种。
(1)传值调用:Call by value。在传值调用时,过程的形式参数取得的是实际参数的值。在这种情况下,形式参数实际上是过程中的局部变量,其值的改变不会导致调用时所传送的实际参数的值发生改变,也就是数据的传送是单向的,返回主调函数时,对应的参数的值保持不变。
(2)引用调用:Call by Reference。也叫作传地址调用,在引用调用时,过程的形式参数取得的是实际参数所在的单元地址。在调用过程中,对该形式参数的引用相当于对实际参数所在的存储单元的地址引用。任何改变形式参数值的操作会反映在该存储单元中,也就是反映在实际参数中,因此数据的传送是双向的,返回主调函数时,对应的参数的值同步发生改变。
下面是近几年对该知识点考察过的真题,基本上是每年必考的题目,以后仍是考试出题的重点,大家要重视起来。
【2017年第20题】函数main()、f()的定义如下所示。调用函数f()时,第一个参数采用传值方式,第二个参数采用传引用方式,main()执行后输出的值为( )?

A、2
B、4
C、5
D、8
解析:本题考查函数调用的基础知识。
在题目中,main( )函数中,调用了函数f(),需要注意的是,第一个参数是1,采用传值方式,传递给了f()函数中的x,第二个参数采用的是传引用方式,x的地址传递给了f()函数中的a。此时一定不要混淆了两个函数中的“x”,他们是不一样的,只不过变量的名字相同而已。就好比两个村子里,都有一个叫做小明的人,我们不能说是同一个人,他们就是局部变量的名字,只在本函数体内有效。
因此在f(intx, int &a)函数中,x=2*a+1=2*2+1=5; a=x+3=5+3=8, 由于a是引用调用,所以a的值改变,对应main()函数中x也会改变,所以返回后x在main()函数中的值为8。
故正确答案为:D
【2018年第19-20题】调用函数时若是引用调用方式,则是将( 1 )。下面所定义的函数f1为值调用方式,函数f2为引用调用方式。若有表达式x=f1(5),则函数调用执行完成后,该表达式中x获得的值为( 2 )。

1、
A、实参的值传给形参
B、形参的值传给实参
C、实参的地址传给形参
D、形参的地址传给实参
2、
A、5
B、20
C、36
D、45
解析:本题考查函数调用的基础知识。
在按引用调用时,过程的形式参数取得的是实际参数所在的单元地址。在按值调用时,过程的形式参数取得的是实际参数的值。
由于函数f1( )采用传值调用,x值在函数f1中不发生变化,值一直是5。函数f2( )采用传址调用,会对b的值产生影响,其中参数b的地址会传递给函数f2( )中的参数x,其中&就是获取b的地址的符号。
在函数f1( )中,执行b=x-1后b=4;函数f2( )中x=2*x+1=2*4+1=9,返回后函数f1( )后,b的值也就变成了9,所以最后b*x=5*9=45。
故正确答案为:1-C 2-D
【2019年第23题】函数main()、f()的定义如下所示。调用函数f()时,第一个参数采用传值(call by value) 方式,第二个参数采用传引用(call by reference)方式,main()执行后输出的值为( )。

A、2
B、3
C、8
D、10
解析:本题考查函数调用的基础知识。
在函数main() 中,x的地址传递给了函数f() 中的a,此时a的变化在返回函数main()时,是同步的,这就是引用调用的特点,而传值调用不会引起原函数内参数的变化。在函数f()中,x=2*2-1=3,a=3+5=8。最终在返回函数main()时,x输出值也为8。
故正确答案为:C
作者唯一官方个人微信公众号(昊洋与你一起成长):HYJY20180101
写于2021年9月29日
作者:昊洋讲师
版权所有,侵权必究




