ByVal 傳送參數記憶體的一個拷貝給被調用者。也就是說,棧中壓入的直接就是所傳的值。
ByRef 傳送參數記憶體的實際地址給被調用者。也就是說,棧中壓入的是實際內容的地址。被調用者可以直接更改該地址中的內容。
ByVal是傳遞值 來源資料不會被修改
你可以把這個值當作自己的局部變數來使用
ByRef是傳遞地址 , 來源資料可能被修改
你對這個變數的操作將對你傳入的那個變數產生影響,就像指標的感覺
執行個體:複製代碼 代碼如下:sub Add1(ByVal no as int32)
no=no+100
end sub
sub Add2(ByRef no as int32)
no=no+100
end sub
private sub button1_click(sender as object,e as eventargs)handles button1.click
dim a as int32
a=100
Add1(a)
msgbox ("a的值為:" & a) '顯示:a的值為100
Add2(a)
msgbox ("a的值為:" & a) '顯示:a的值為200,因為Add2中的參數no為ByRef,即
'按地址傳遞,因此在Add2中對no進行修改後,將會導致
'源參數a的值也被修改。
End Sub
——————————————————————————————————————
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
上面標號Note處的語句的目的,是將k賦值為40000,等同於語句k=40000,你可以在"立即"視窗實驗一下,會發現k的值的確成了40000。
實際上上面這個語句,翻譯成白話:
-----------------------------------------------------------------
就是從儲存常數40000的臨時變數處拷貝4個位元組到變數k所在的記憶體中。
-----------------------------------------------------------------
現在我們來改變一個Note處的語句,若改成下面的語句:
Note2: CopyMemory ByVal VarPtr(k), ByVal 40000, 4
這句話的意思就成了,從地址40000拷貝4個位元組到變數k所在的記憶體中。由於地址40000所在的記憶體我們無權訪問,作業系統會給我們一個Access Violation記憶體越權訪問錯誤,告訴我們"試圖讀取位置0x00009c40處記憶體時出錯,該記憶體不能為'Read'"。
我們再改成如下的語句看看。
Note3: CopyMemory VarPtr(k), 40000, 4
這句話的意思就成了,從儲存常數40000的臨時變數處拷貝4個位元組到到儲存變數k所在記憶體位址值的臨時變數處。這不會出出記憶體越權訪問錯誤,但k的值並沒有變。
我們可以把程式改改以更清楚的休現這種區別,如下面的程式四:
【程式四】:'看看我們的東西被拷貝到哪兒去了 複製代碼 代碼如下:Sub TestCopyMemory()
Dim i As Long, k As Long
k = 5
i = VarPtr(k)
NOTE4: CopyMemory i, 40000, 4
Debug.Print k
Debug.Print i
i = VarPtr(k)
NOTE5: CopyMemory ByVal i, 40000, 4
Debug.Print k
End Sub
程式輸出:
5
40000
40000
由於NOTE4處使用預設的ByRef,傳遞的是i的地址(也就是指向i的指標),所以常量40000拷貝到了變數i裡,因此i的值成了40000,而k的值卻沒有變化。但是,在NOTE4前有:i=VarPtr(k),本意是要把i本身做為一個指標來使用。這時,我們必須如NOTE5那樣用ByVal來傳遞指標i,由於i是指向變數k的指標,所以最後常量40000被