加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VB中ByRef与ByVal参数传递方式的区别

(2018-09-29 14:09:58)
标签:

vb

byref与byval

分类: 程序设计_VB
简而言之,ByRef 和 ByVal 的区别在于参数源是否可以被函数修改,前者(默认方式)是可以被修改的,而后者是不能被修改的。
例:
Private Function Func(ByRef argv1 As String, ByVal argv2 As String)   
 argv1 = "I love WYC!"   
 argv2 = "I love WYC!"
End Function

调用:
Sub Main() 
Dim a As String, b As String  
 a = "This is a!"    b = "This is b!"    
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
上面是百度知道牛人的解释,感觉用的是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
 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有