Private Sub Command1_Click()
Dim X As Integer
X = 1
Call sort(X)
Print X
Call sort((X))
Print X
End Sub
Private Sub sort(y As Integer)
y = y + 1
End Sub为什么是2
2我知道第一个2是:X = 1
Call sort(1)
y=y+1=2
所以第一个是 Print 2
接着是Call sort((2))
这个Call sort((2))是怎么得出第二个Print 2的呢?
Dim X As Integer
X = 1
Call sort(X)
Print X
Call sort((X))
Print X
End Sub
Private Sub sort(y As Integer)
y = y + 1
End Sub为什么是2
2我知道第一个2是:X = 1
Call sort(1)
y=y+1=2
所以第一个是 Print 2
接着是Call sort((2))
这个Call sort((2))是怎么得出第二个Print 2的呢?
因为是ByRef传入的啊
问了好几次了。
Private Sub Command1_Click()
Dim X As Integer
X = 1 '这个时候 x = 1
Call sort(X) 'Call sort(X)后 x = 2
Print X
Call sort(X)
Print X '这个时候 x = 3
End Sub
默认是byref传址加上byvalPrivate Sub sort(byval y As Integer)
就不会了
VB 默认是 ByRef ,调用 sort() 时,把 X 的内存地址传入,因此 sort() 中的 y 与 主调函数中的 X 是同一个东西,在 sort 中 改变 y 的值,也就把主调函数中的 X 的值改变了。第二次调用:Call sort((X))
请注意!这次调用的参数是 (X) ,而不是 X 。
这是有区别的!(X)指的是 变量X 的值,而不是X自身。
因此第二次调用时,传入的地址是保存 X 的值的一个临时内存地址,而不是 X 的地址!
所以第二次调用,sort() 函数改变的是那个临时内存地址内的值,变量 X 的内存数据并没有改变,X 的值依然是 2 。
ByRef 可选的。表示该参数按地址传递。ByRef 是 Visual Basic 的缺省选项。 按值
一种将参数值而不是将地址传递给过程的方式,这就使过程访问到变量的复本。结果,过程不可改变变量的真正值。按地址
一种将参数地址而不是将值传递给过程的方式,这就使过程访问到实际的变量。结果,过程可改变变量的真正值。除非另作说明,否则按地址传递参数。
Call Test(X, "Call Test(X, String)")
Call Test((X), "Call Test((X), String)")
Test X, "Test X, String"
Test (X), "Test(X), String"End SubPrivate Sub Test(Y As Integer, strMsg As String) MsgBox "调用形式:" & strMsg & vbLf & "参数的内存地址:" & Hex$(VarPtr(Y)), 64, "测试"End Sub