ByVal是传值调用,比如变量a把自己的值传递给变量b,b获得的只是a的值,本质上它们是两个不同的变量,只不过它们的值相同而已,而改变b的值并不会影响到a的值;
ByRef则是传址调用,变量a把自己所在的内存地址传递给变量b,这时候a和b所指向的内存地址是一样的,所以实际上它们相当于同一个变量,只是名字不同而已(如果处在不同的作用域那么也可以同名),改变b的值那么a的值也会跟着改变!
直接的说:
byval:将参数按值传递。即A=B,但不可以B=A,(只能将实参传递给形参)为单向传输。如果实参为常量或表达式,则默认为值传递。如果实参为变量,却想按值传递,则需要在变量前加上关键字BYVAL,或将调用过程语句的实参中的变量括起来。
Byref:将参数按地址传递,即A=B,且可以B=A,(形参改变,则对应的实参也将随之改变)为双向传输。同BYVAL(与BYVAL相反)
例子:
Private sub Exam (Byval X, Y, Z)
X=X+2
Y=Y-3
Z=Z^2
? X, Y
End sub
Private sub form_activate()
Dim A%, B%, C%
A=1: B=2: C=3
? A, B, C
Call Exam(A, (B), C)
? A, B, C
End Sub
运行结果为:
1 2 3
3 -1 9
1 2 9
解释:
上面例子中定义过程语句中的形参X前加上BYVAL,调用该过程的语句中的B被括起来。
所以在运算中,AB为按值传递(单向),C为按地址传递(双向)
BYREF与之相似
如还有疑问,可说明问题
haozhennan@outlook.com
1398280353(郝振楠)
byval 的全称 by value,突出在value上,就是传值
byref 的全称 by reference,突出在 reference上,就是传址
如果一个函数的参数使用byval修饰,则在函数内部修改了这个参数的值的时候,在调用这个函数时在该参数位置的变量的值从未改变。
如果用byref修饰,则在函数内部修改这个参数的值的同时,调用的变量的值也会同时改变。