8.4.3 过程调用中的参数传递方式

8.4.3 过程调用中的参数传递方式

调用Sub过程和Function过程时,把实参的值传递给形参,称为参数传递。参数的传递方式有两种:按地址传递和按值传递。

1.按地址传递

在这种参数传递方式中,无论形参与实参是否名字相同,在内存中它们占用相同的存储单元,实质上是用一个变量在两个过程中使用不同的标识符。当被调用过程的形参值发生变化时,实参值也产生同样的变化。默认的参数传递方式是按地址。如果要显示指定按地址传递方式,可以在每个形象前增加关键字ByRef。

2.按值传递

按值传递指实参和形参是两个不同的变量,占用不同的内存单元,实参将其值赋给形参,以后形参的变化不会影响到实参的值。也就是说,即使形参和实参同名,他们也是两个不同的变量。要按值传递,必须在形参前冠以关键字ByVal。

任务8.7 分析如下程序,写出运行结果。

Private Sub Tes()

Dim a As Integer,b As Integer

a=5∶b=10

Call TestChange(a,b)

Debug.Print"a=";a,"b=";b

End Sub

Private Sub TestChange(ByVal x As Integer,ByRef y AsInteger)

x=x+10:y=y+20

Debug.Print"x=";x,"y=";y

End Sub

运行结果:

运行结果如图8-31所示。

图8-31 运行结果

分析:

程序运行时,调用TestChange过程,程序进入TestChange过程,将实际参数a,b的值传给参数x,y。此时x=5,y=10。执行赋值语句后,x=15,y=30。由于a采用值传递方式,保持原值不变,b采用地址传递方式,形参的改变引起实参的改变,因此b=30。

说明:

如果程序只是作为测试,可以把结果直接显示在立即窗口,格式是:

Debug.Print参数系列

参数系列之间如果用逗号分隔,按标准区间输出,每个标准区间为14个字符宽。如果以分号分隔,以紧凑形式输出,正数前省略了“+”一个符号位,数字的后面空一位。

任务8.8 分析如下程序,填写注释,简述程序功能。

Private Function MaxValue(a As Integer,b As Integer,c As Integer) '注释1

Dim m As Integer '注释2

m=a '注释3

If b>m Then m=b

If c>m Then m=c

MaxValue=m '注释4

End Function

Private Static Sub Max() '注释5

Dim x As Integer,y As Integer,z As Integer,m As Integer

x=Rnd*1000 '注释6

y=Rnd*1000

z=Rnd*1000

m=MaxValue(x,y,z) '注释7

MsgBox x &","&y &","&z &vbCrLf &_

"最大值是:"&m,vbOKOnly+vbInformation,"输出" '注释8

End Sub

解答:

注释1:定义MaxValue()函数过程,3个形参

注释2:定义整形变量,代表3个数的最大值

注释3:把a假定最大值

注释4:函数返回最大值

注释5:定义Max过程

注释6:随机生成3位数的整数

注释7:调用MaxValue函数

注释8:显示最大值

功能:MaxValue()函数功能是返回3个参数中的最大值,Max过程功能是随机生成3个3位整数,通过调用MaxValue()函数,返回3个数中最大值,并通过输出框显示。