ByVal傳送參數內存的一個拷貝給被調用者。也就是說,棧中壓入的直接就是所傳的值。
ByRef傳送參數內存的實際地址給被調用者。也就是說,棧中壓入的是實際內容的地址。被調用者可以直接更改該地址中的內容。
ByVal是傳遞值源數據不會被修改
你可以把這個值當作自己的局部變量來使用
ByRef是傳遞地址,源數據可能被修改
你對這個變量的操作將對你傳入的那個變量產生影響,就像指針的感覺
實例:
複製代碼代碼如下:
subAdd1(ByValnoasint32)
no=no+100
endsub
subAdd2(ByRefnoasint32)
no=no+100
endsub
privatesubbutton1_click(senderasobject,easeventargs)handlesbutton1.click
dimaasint32
a=100
Add1(a)
msgbox("a的值為:"&a)'顯示:a的值為100
Add2(a)
msgbox("a的值為:"&a)'顯示:a的值為200,因為Add2中的參數no為ByRef,即
'按地址傳遞,因此在Add2中對no進行修改後,將會導致
'源參數a的值也被修改。
EndSub
——————————————————————————————————————
3、ByVal和ByRef
ByVal傳遞的參數值,而ByRef傳遞的參數的地址。在這裡,我們不用去區別傳指針/傳地址/傳引用的不同,在VB裡,它們根本就是一個東西的三種不同說法,即使VB的文檔裡也有地方在混用這些術語(但在C++裡的確要區分指針和引用)
初次接觸上面的程序二SwapPtr的朋友,一定要搞清在裡面的CopyMemory調用中,在什麼地方要加ByVal,什麼地方不加(不加ByVal就是使用VB缺省的ByRef)
準確的理解傳值和傳地址(指針)的區別,是在VB裡正確使用指針的基礎。
現在一個最簡單的實驗來看這個問題,如下面的程序三:
【程序三】:體會ByVal和ByRef
複製代碼代碼如下:
Sub TestCopyMemory()
Dim k As Long
k = 5
Note: CopyMemory ByVal VarPtr(k), 40000, 4
Debug.Print k
End Sub