VB中ByRef与ByVal参数传递方式的区别
(2018-09-29 14:09:58)
标签:
vbbyref与byval |
分类: 程序设计_VB |
简而言之,ByRef 和 ByVal 的区别在于参数源是否可以被函数修改,前者(默认方式)是可以被修改的,而后者是不能被修改的。
例:
Private Function Func(ByRef argv1 As String, ByVal argv2 As
String)
End Function
调用:
Sub Main()
Dim a As String, b As String
Func a, b
MsgBox a & ";" & bEnd Sub
程序执行后的结果为:I love WYC!;This is b!原因是:ByRef
类型的参数在函数过程中被重新赋值,所以函数调用结束后,a变量的值为新被赋予的“I love WYC!”,而作为 ByVal
类型的参数b,由于不能被程序修改,即使在函数过程中对该变量重新赋值,其值仍为函数调用前的“This is b!”。另外,声明
ByRef 类型的参数时,可以不声明为 ByRef <参数><类型>,而只用
<参数><类型> 即可, ByVal 则必须使用 ByVal
<参数><类型>。
---------------------
本文来自 frontgoggle 的CSDN 博客,全文地址请点击:https://blog.csdn.net/frontgoggle/article/details/1327454?utm_source=copy
*************************************************************************************************
ByVal 与 ByRef(默认值)
这两个是子过程的参数传递时,指定参数按什么传递的
ByVal(按值传递)
ByRef(按地址传递)
具体这样来理解:
过程中的参数列表,我们称形参
调用过程时的参数列表,我们称实参
在调用时,我们要将实参的值传递给形参,这样过程才能拿这些数据参与计算并实现一些功能
那么在传递的过程中,就存在这两种传递方式
传值时(ByVal),是先给形参开辟一个临时地址,将实参的内容传入这个临时地址,这样,传递后,形参与实参是在两上不同的地址中,也就是说他们是相互独立的
传址时(ByRef),是直接将实参的地址传递给形参,这样,形参与实参就共用一个地址,所以,形参内容的改变,也直接改变了实参的内容
通过上面的分析,你只要记得:
按值传递时(ByVal),形参的改变不会影响到实参
按址传递时(ByRef),形参的改变,会影响到实参
应用时,我们可以利用按址传递的过程,给一个子过程(Sub过程)进行参数返回
例:
Dim A as integer,B as integer
A=1
B=2
Call AAA(A,B)
Print A,B
'得到的结果是2 3 (形参的改变影响到了实参)
Call BBB(A,B)
Pring A,B '得到的结果跟上面的一样,2 3(形参的改变并没有影响到这个实参)
Sub AAA(I as integer,J as integer) '默认,则按址传递
i=i+1
J=J+1
End Sub
Sub BBB(ByVal I as integer,ByVal J as integer)
i=i+1
J=J+1
End Sub
这两个是子过程的参数传递时,指定参数按什么传递的
ByVal(按值传递)
ByRef(按地址传递)
具体这样来理解:
过程中的参数列表,我们称形参
调用过程时的参数列表,我们称实参
在调用时,我们要将实参的值传递给形参,这样过程才能拿这些数据参与计算并实现一些功能
那么在传递的过程中,就存在这两种传递方式
传值时(ByVal),是先给形参开辟一个临时地址,将实参的内容传入这个临时地址,这样,传递后,形参与实参是在两上不同的地址中,也就是说他们是相互独立的
传址时(ByRef),是直接将实参的地址传递给形参,这样,形参与实参就共用一个地址,所以,形参内容的改变,也直接改变了实参的内容
通过上面的分析,你只要记得:
按值传递时(ByVal),形参的改变不会影响到实参
按址传递时(ByRef),形参的改变,会影响到实参
应用时,我们可以利用按址传递的过程,给一个子过程(Sub过程)进行参数返回
例:
Dim A as integer,B as integer
A=1
B=2
Call AAA(A,B)
Call BBB(A,B)
Pring A,B '得到的结果跟上面的一样,2 3(形参的改变并没有影响到这个实参)
Sub AAA(I as integer,J as integer) '默认,则按址传递
i=i+1
J=J+1
End Sub
Sub BBB(ByVal I as integer,ByVal J as integer)
i=i+1
J=J+1
End Sub
上面是百度知道牛人的解释,感觉用的是C++的思维解释VB语言,真的很值的参考与学习。
******************************************************************
ByVal是按值传递
就是不改变地址里的变量值
而ByRef是改变地址里的变量值的
ByVal传递的只是一个值 向一个地址传递一个值进去
而ByRef的形参和实参共用一个储存单元 因为他们是在一个地址里的
一般ByVal API函数用的比较多
不想改变原地址里的变量值的时候用ByVal
举个例子吧
private sub form_load
dim x as integer
x = 10
aa(x)
print x
end sub
sub aa(ByVal x as integer)
x = 20
end sub
最后的结果是10
也就是形参并影响实参的值
如果换成下面的写法
private sub form_load
dim x as integer
x = 10
aa(x)
print x
end sub
sub aa(Byref x as integer)'Byref关键字是默认的
x = 20
end sub
这次的结果是20
就是不改变地址里的变量值
而ByRef是改变地址里的变量值的
ByVal传递的只是一个值 向一个地址传递一个值进去
而ByRef的形参和实参共用一个储存单元 因为他们是在一个地址里的
一般ByVal
不想改变原地址里的变量值的时候用ByVal
举个例子吧
private sub form_load
dim x as integer
x = 10
aa(x)
print x
end sub
sub aa(ByVal x as integer)
x = 20
end sub
最后的结果是10
也就是形参并影响实参的值
如果换成下面的写法
private sub form_load
dim x as integer
x = 10
aa(x)
print x
end sub
sub aa(Byref x as integer)'Byref关键字是默认的
x = 20
end sub
这次的结果是20

加载中…