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个数中最大值,并通过输出框显示。