ByVal和ByRef(編寫ASP子程序所用到命令)
更新時間:2006年08月26日 00:00:00 作者:
ByRef 傳送參數(shù)內(nèi)存的實際地址給被調(diào)用者。也就是說,棧中壓入的是實際內(nèi)容的地址。被調(diào)用者可以直接更改該地址中的內(nèi)容。
ByVal 傳送參數(shù)內(nèi)存的一個拷貝給被調(diào)用者。也就是說,棧中壓入的直接就是所傳的值。
ByRef 傳送參數(shù)內(nèi)存的實際地址給被調(diào)用者。也就是說,棧中壓入的是實際內(nèi)容的地址。被調(diào)用者可以直接更改該地址中的內(nèi)容。
ByVal是傳遞值 源數(shù)據(jù)不會被修改
你可以把這個值當(dāng)作自己的局部變量來使用
ByRef是傳遞地址 , 源數(shù)據(jù)可能被修改
你對這個變量的操作將對你傳入的那個變量產(chǎn)生影響,就像指針的感覺
實例:
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中的參數(shù)no為ByRef,即
'按地址傳遞,因此在Add2中對no進(jìn)行修改后,將會導(dǎo)致
'源參數(shù)a的值也被修改。
End Sub
——————————————————————————————————————
3、ByVal和ByRef
ByVal傳遞的參數(shù)值,而ByRef傳遞的參數(shù)的地址。在這里,我們不用去區(qū)別傳指針/傳地址/傳引用的不同,在VB里,它們根本就是一個東西的三種不同說法,即使VB的文檔里也有地方在混用這些術(shù)語(但在C++里的確要區(qū)分指針和引用)
初次接觸上面的程序二SwapPtr的朋友,一定要搞清在里面的CopyMemory調(diào)用中,在什么地方要加ByVal,什么地方不加(不加ByVal就是使用VB缺省的ByRef)
準(zhǔn)確的理解傳值和傳地址(指針)的區(qū)別,是在VB里正確使用指針的基礎(chǔ)。
現(xiàn)在一個最簡單的實驗來看這個問題,如下面的程序三:
【程序三】:體會ByVal和ByRef
Sub TestCopyMemory()
Dim k As Long
k = 5
Note: CopyMemory ByVal VarPtr(k), 40000, 4
Debug.Print k
End Sub
上面標(biāo)號Note處的語句的目的,是將k賦值為40000,等同于語句k=40000,你可以在"立即"窗口試驗一下,會發(fā)現(xiàn)k的值的確成了40000。
實際上上面這個語句,翻譯成白話:
-----------------------------------------------------------------
就是從保存常數(shù)40000的臨時變量處拷貝4個字節(jié)到變量k所在的內(nèi)存中。
-----------------------------------------------------------------
現(xiàn)在我們來改變一個Note處的語句,若改成下面的語句:
Note2: CopyMemory ByVal VarPtr(k), ByVal 40000, 4
這句話的意思就成了,從地址40000拷貝4個字節(jié)到變量k所在的內(nèi)存中。由于地址40000所在的內(nèi)存我們無權(quán)訪問,操作系統(tǒng)會給我們一個Access Violation內(nèi)存越權(quán)訪問錯誤,告訴我們"試圖讀取位置0x00009c40處內(nèi)存時出錯,該內(nèi)存不能為'Read'"。
我們再改成如下的語句看看。
Note3: CopyMemory VarPtr(k), 40000, 4
這句話的意思就成了,從保存常數(shù)40000的臨時變量處拷貝4個字節(jié)到到保存變量k所在內(nèi)存地址值的臨時變量處。這不會出出內(nèi)存越權(quán)訪問錯誤,但k的值并沒有變。
我們可以把程序改改以更清楚的休現(xiàn)這種區(qū)別,如下面的程序四:
【程序四】:'看看我們的東西被拷貝到哪兒去了
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被
ByRef 傳送參數(shù)內(nèi)存的實際地址給被調(diào)用者。也就是說,棧中壓入的是實際內(nèi)容的地址。被調(diào)用者可以直接更改該地址中的內(nèi)容。
ByVal是傳遞值 源數(shù)據(jù)不會被修改
你可以把這個值當(dāng)作自己的局部變量來使用
ByRef是傳遞地址 , 源數(shù)據(jù)可能被修改
你對這個變量的操作將對你傳入的那個變量產(chǎn)生影響,就像指針的感覺
實例:
復(fù)制代碼 代碼如下:
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中的參數(shù)no為ByRef,即
'按地址傳遞,因此在Add2中對no進(jìn)行修改后,將會導(dǎo)致
'源參數(shù)a的值也被修改。
End Sub
——————————————————————————————————————
3、ByVal和ByRef
ByVal傳遞的參數(shù)值,而ByRef傳遞的參數(shù)的地址。在這里,我們不用去區(qū)別傳指針/傳地址/傳引用的不同,在VB里,它們根本就是一個東西的三種不同說法,即使VB的文檔里也有地方在混用這些術(shù)語(但在C++里的確要區(qū)分指針和引用)
初次接觸上面的程序二SwapPtr的朋友,一定要搞清在里面的CopyMemory調(diào)用中,在什么地方要加ByVal,什么地方不加(不加ByVal就是使用VB缺省的ByRef)
準(zhǔn)確的理解傳值和傳地址(指針)的區(qū)別,是在VB里正確使用指針的基礎(chǔ)。
現(xiàn)在一個最簡單的實驗來看這個問題,如下面的程序三:
【程序三】:體會ByVal和ByRef
復(fù)制代碼 代碼如下:
Sub TestCopyMemory()
Dim k As Long
k = 5
Note: CopyMemory ByVal VarPtr(k), 40000, 4
Debug.Print k
End Sub
上面標(biāo)號Note處的語句的目的,是將k賦值為40000,等同于語句k=40000,你可以在"立即"窗口試驗一下,會發(fā)現(xiàn)k的值的確成了40000。
實際上上面這個語句,翻譯成白話:
-----------------------------------------------------------------
就是從保存常數(shù)40000的臨時變量處拷貝4個字節(jié)到變量k所在的內(nèi)存中。
-----------------------------------------------------------------
現(xiàn)在我們來改變一個Note處的語句,若改成下面的語句:
Note2: CopyMemory ByVal VarPtr(k), ByVal 40000, 4
這句話的意思就成了,從地址40000拷貝4個字節(jié)到變量k所在的內(nèi)存中。由于地址40000所在的內(nèi)存我們無權(quán)訪問,操作系統(tǒng)會給我們一個Access Violation內(nèi)存越權(quán)訪問錯誤,告訴我們"試圖讀取位置0x00009c40處內(nèi)存時出錯,該內(nèi)存不能為'Read'"。
我們再改成如下的語句看看。
Note3: CopyMemory VarPtr(k), 40000, 4
這句話的意思就成了,從保存常數(shù)40000的臨時變量處拷貝4個字節(jié)到到保存變量k所在內(nèi)存地址值的臨時變量處。這不會出出內(nèi)存越權(quán)訪問錯誤,但k的值并沒有變。
我們可以把程序改改以更清楚的休現(xiàn)這種區(qū)別,如下面的程序四:
【程序四】:'看看我們的東西被拷貝到哪兒去了
復(fù)制代碼 代碼如下:
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被
相關(guān)文章
使用AJAX實現(xiàn)UTF8編碼表單提交到GBK編碼腳本無亂碼的解決方法
這篇文章主要介紹了用AJAX實現(xiàn),多個不同編碼的項目(GBK,UTF8)互相通過 POST/GET 匯總表單數(shù)據(jù)。最終實現(xiàn) 使用同一個頁面接收 不同編碼的 表單(GBK,UTF8),特別適合 JS 采集項目,需要的朋友可以參考下2020-09-09ASP之處理用Javascript動態(tài)添加的表單元素數(shù)據(jù)的代碼
ASP之處理用Javascript動態(tài)添加的表單元素數(shù)據(jù)的代碼...2007-11-11asp實現(xiàn)檢查ip地址是否為內(nèi)網(wǎng)或者私有ip地址的代碼分享
這篇文章主要介紹了asp實現(xiàn)檢查ip地址是否為內(nèi)網(wǎng)或者私有ip地址的代碼分享,給同樣在找IP判斷的使用,需要的朋友可以參考下2014-08-08ASP基礎(chǔ)入門第十篇(ASP內(nèi)建對象Server)
這篇文章主要介紹了ASP內(nèi)建對象Server的相關(guān)資料,需要的朋友可以參考下2015-10-10解決 JScript 中使用日期類型數(shù)據(jù)時出現(xiàn)類型錯誤的問題
在服務(wù)端JScript中,有些時候需要使用日期類型的數(shù)據(jù),比如說設(shè)置一個cookie的到期時間,更新數(shù)據(jù)庫中的日期字段等。但是按照平常的方法來用js里的date類型數(shù)據(jù)時,運(yùn)行時就會發(fā)生錯誤。2008-05-05