请高手仔细讲解一下ByVal的意思

来源:百度知道 编辑:UC知道 时间:2024/06/01 04:13:11
请问一下两段代码的区别是什么,为什么一个结果是0,一个是10?
第一段:
Private Sub Form_Click()
Dim a As Integer
For i = 1 To 10
Call abcd(a)
Next i
Print a
End Sub
Sub abcd(ByVal x)
x = x + 1
End Sub
第二段:
Private Sub Form_Click()
Dim a As Integer
For i = 1 To 10
Call abcd(a)
Next i
Print a
End Sub
Sub abcd(x)
x = x + 1
End Sub
请通俗地讲一下原理,谢谢

byval是把内存数值的拷贝给程序,所以改变的只是拷贝,内存原来的值是不会改变的。
第一个a的值并没有变化。

简单一点
传值不会改变实参的值
传址会改变实参的值

byval是“按值传递”的意思,只传递数值,不传递地址,不会改变原值。

Dim 变量A As Integer, 变量B As Integer

Private Sub Form_Click()
变量A = 1001
变量B = 1002
Call AB(变量A, 变量B)
End Sub

Private Sub AB(ByVal vA As Integer, vB As Integer)
Print "传入的值是vA = " & vA & " , 值vB = " & vB
Print "下面将两个值都设为100"
vA = 100
vB = 100
Print "转换后的值是vA = " & vA & " , 值vB = " & vB
Print "而程序中 变量A = " & 变量A & " , 变量B = " & 变量B
End Sub

byval:传递参数值,参数的值不会在子过程中改变,byref:传递地址,参数的值会随子过程中的值的改变而改变。
你把
Sub abcd(ByVal x)
x = x + 1
End Sub
改成
Sub abcd(ByRef x)
x = x + 1
End Sub
就知道其中的区别了