- 55
- 0
- 约2.93千字
- 约 5页
- 2017-02-28 发布于湖北
- 举报
VB参数传递(传值ByVal与传址ByRef)
在过程调用时,一般主调过程与被调过程之间有数据传递,即将主调过程的实参传递给被调过程的形参,完成实参与形参的结合,然后执行被调过程体,被调过程执行结束后返回主调程序,并根据所使用的参数传递方式,决定是否将被调过程的形参值返回给主调过程的实参。在VB中,实参与形参的结合有两种方式,即传值(ByVal)和传址(ByRef)。下面将采用图示方法,结合实例,对两种参数传递方式进行深人分析。
1.传值方式(ByVal)。
VB中的传值方式,实参与形参在内存中占用不同的内存单元,当调用一个过程时,系统把实参的值复制一份给形参,实参与形参就断开了联系,被调过程中的操作是在形参自己的内存单元中进行,当过程调用结束时,形参所占用的内存单元同时被释放,调用过程中对形参值的改变对实参没有影响。因此,值传递方式又称为单向传递,即只能由实参传递给形参,形参的值不能返回给实参。在过程定义时,必须明确指定参数是按值传递的,在形参的前面加上关键字 ByVal。
(I)应用举例。
采用值传递方式,编写交换两个数的过程Swap。分析能否真正实现两数互换
Swap 子过程:
Public Sub Swap( ByVal x As Integer, ByVal y As Integer)
Dim t As Integer
t=x :x=y :y=t
End Sub
主调过程:
Public Sub Command1_Click ( )
Dim a As Integer,b As Integer
a=10 :b=20
Call Swap(a,b)
Print A=;a, B= ;b
End Sub
执行程序,运行结果:A = 10,B =20,并未实现a、 b互换。
2.传址方式(ByRef)。
传址方式也称引用方式,是VB默认的参数传递方式,当调用一个过程时,系统将实参的地址传递给形参,实参与形参在内存中占用相同的存储单元。因此,被调过程中形参值发生变化,主调过程中实参值也会随之变化,这种传递方式是双向的,也称双向传递。
总之,传值时就是在内存中新开辟一个空间,将值赋给这个新开辟的空间,其生命周期为该函数调用结束时释放该空闲,计算结果不影响原调用数据内存空间的值。传址时同样新开辟一个空间,但不同的是将所用数据空间的内存地址存在新开辟的空间中,即指针,函数在数据处理过程中由于是指针,即对源数据进行操作,操作后结果影响原数据。
Option Base 1
Private Function gcd(ByVal m%, ByVal n%) As Integer
If m n Then t = m: m = n: n = t
Do
r = m Mod n
If r = 0 Then Exit Do
m = n
n = r
Loop
gcd = n
End Function
Private Sub Command1_Click()
Dim a() As Integer
n = InputBox(输入n)
ReDim a(n)
For i = 1 To n 输入要求公约数的n个数
a(i) = InputBox(输入数据)
Next i
n1 = a(1)
For i = 2 To n n个数调用n-1次gcd函数过程求最大公约数
m1 = a(i)
mn = gcd(m1, n1)
If mn = 1 Then Exit For Else n1 = mn 只要某次求得的最大公约数为1,不再往下求
Next i
Print mn 显示n个数中的最大公约数
End Sub
Function power (x As Single, ByVal y As Integer)
Dim result As Single
result = 1
Do While y 0
result = result * x
y = y - 1
Loop
power = result
End Function
Sub Form_Click()
For i = 1 To 5
r = power(5,i)
Print r
Next i
End Sub
如果去掉 ByVal,则结果
而 书中的结果不同,但解释是:
过程Power中的参数y使用了关键字ByVal,因而事件过程可以顺利执行,5次循环分别打印出5,5 * 5,5 * 5 * 5,…的值。但是,如果去掉参数y前面的关
原创力文档

文档评论(0)