Visual Basic 值传递与地址传递
值传递与地址传递
传递参数的方式有两种:如果调用语句中的实际参数是常量或表达式,或定义过程时选用ByVal关键字,就可以按值传递。如果调用语句中实际参数为变量,或定义过程时选用ByRef关键字,就可以按地址传递。
1. 按值传递参数
按值传递参数时,Visual Basic给传递的形参分配一个临时的内存单元,将实参的值传递到这个临时单元去。实参向形参传递是单向的,如果在被调用的过程中改变了形参值,则只是临时单元的值变动,不会影响实参变量本身。当被调用过程结束返回主调过程时,Visual Basic将释放形参的临时内存单元。
当要求变量按值传递时,可以先把变量变成一个表达式,把变量转换成表达式的最简单的方法就是把它放在括号内。例如把变量“A”用括号括起来,“(A)”就成为一个表达式了。或者定义过程时用ByVal关键字指出参数是按值来传递的。
【例5.3】 用函数过程编写程序,求a,b两数中最大数。
Max函数为求最大数,在Command1_click中调用Max函数,程序代码如下:
Private Function Max(ByVal x As Integer, ByVal y As Integer)
Dim z As Integer
If x < y Then z = x: x = y: y = z
Max = x
TextX.Text = x
TextY.Text = y
End Function
Private Sub Command1_Click()
Dim a As Integer, b As Integer, c As Integer
a = Val(TextA.Text)
b = Val(TextB.Text)
TextMax.Text = Max(a, b)
TextRA.Text = a
TextRB.Text = b
End Sub
在文本框中输入变量a为25、b为36,单击“计算”按钮,程序运行结果如图5.7所示。
图5.7 按值传递运行界面 图5.8 数据传递过程(按值)
通过函数调用,给形参分配临时内存单元x和y,将实参a和b的数据传递给形参,内存单元的存储值如图5.8所示。在被调函数中x,y和z交换数据,调用结束后,实参单元a和b仍保留原值,参数的传递是单向的。
2. 按地址传递参数
按地址传递参数,是指把形参变量的内存地址传递给被调用过程,形参和实参具有相同的地址,即形参、实参共享一段存储单元。因此,在被调过程中改变形参的值,则相应实参的值也被改变,也就是说,与按值传递参数不同,按地址传递参数可以在被调过程中改变实参的值。系统缺省情况下是按地址传递参数。在传址调用时,实参必须是变量,常量或表达式无法传址。
如果将例5.4求两数中最大数的程序改为按址传递,Max函数的代码如下:
Private Function Max(x As Integer, y As Integer)
……
End Function
其他程序代码不变。
当输入变量a为25、b为36时,形参与实参的数据传递如图5.9所示。
图5.9 数据传递过程(按址) 图5.10 按址传递运行结果
由于形参和实参共用同一内存单元,在被调用函数中交换x和y的数值后,a和b的数值也同样发生变化。程序运行结果如图5.10所示。
采用值传递只能从外界向过程传入信息,但不能传出;而采用地址传递则既能传入、又能传出。正是由于不能传出,过程结束后,值传递中形参值变化就不会影响外界的任何量,因而在一定意义上说,值传递比较安全。
值传递和地址传递各有特点,采用哪一种更合适,则视情况而定。一般来说,需要传出参数值时应该用地址传递,否则采用值传递较好。