佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > ByVal和ByRef(編寫(xiě)ASP子程序所用到命令)

ByVal和ByRef(編寫(xiě)ASP子程序所用到命令)

熱門(mén)標(biāo)簽:科大訊飛語(yǔ)音識(shí)別系統(tǒng) 電子圍欄 Linux服務(wù)器 Mysql連接數(shù)設(shè)置 服務(wù)器配置 銀行業(yè)務(wù) 阿里云 團(tuán)購(gòu)網(wǎng)站
ByVal 傳送參數(shù)內(nèi)存的一個(gè)拷貝給被調(diào)用者。也就是說(shuō),棧中壓入的直接就是所傳的值。
ByRef 傳送參數(shù)內(nèi)存的實(shí)際地址給被調(diào)用者。也就是說(shuō),棧中壓入的是實(shí)際內(nèi)容的地址。被調(diào)用者可以直接更改該地址中的內(nèi)容。
ByVal是傳遞值 源數(shù)據(jù)不會(huì)被修改
你可以把這個(gè)值當(dāng)作自己的局部變量來(lái)使用
ByRef是傳遞地址 , 源數(shù)據(jù)可能被修改
你對(duì)這個(gè)變量的操作將對(duì)你傳入的那個(gè)變量產(chǎn)生影響,就像指針的感覺(jué)

實(shí)例:
復(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,因?yàn)锳dd2中的參數(shù)no為ByRef,即
                                 '按地址傳遞,因此在Add2中對(duì)no進(jìn)行修改后,將會(huì)導(dǎo)致
                                 '源參數(shù)a的值也被修改。
End Sub

——————————————————————————————————————
3、ByVal和ByRef
    ByVal傳遞的參數(shù)值,而B(niǎo)yRef傳遞的參數(shù)的地址。在這里,我們不用去區(qū)別傳指針/傳地址/傳引用的不同,在VB里,它們根本就是一個(gè)東西的三種不同說(shuō)法,即使VB的文檔里也有地方在混用這些術(shù)語(yǔ)(但在C++里的確要區(qū)分指針和引用)
    初次接觸上面的程序二SwapPtr的朋友,一定要搞清在里面的CopyMemory調(diào)用中,在什么地方要加ByVal,什么地方不加(不加ByVal就是使用VB缺省的ByRef)
    準(zhǔn)確的理解傳值和傳地址(指針)的區(qū)別,是在VB里正確使用指針的基礎(chǔ)。
    現(xiàn)在一個(gè)最簡(jiǎn)單的實(shí)驗(yàn)來(lái)看這個(gè)問(wèn)題,如下面的程序三:
【程序三】:體會(huì)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)號(hào)Note處的語(yǔ)句的目的,是將k賦值為40000,等同于語(yǔ)句k=40000,你可以在"立即"窗口試驗(yàn)一下,會(huì)發(fā)現(xiàn)k的值的確成了40000。
    實(shí)際上上面這個(gè)語(yǔ)句,翻譯成白話(huà):
 -----------------------------------------------------------------
 就是從保存常數(shù)40000的臨時(shí)變量處拷貝4個(gè)字節(jié)到變量k所在的內(nèi)存中。
 -----------------------------------------------------------------
    現(xiàn)在我們來(lái)改變一個(gè)Note處的語(yǔ)句,若改成下面的語(yǔ)句:
Note2:   CopyMemory ByVal VarPtr(k), ByVal 40000, 4
    這句話(huà)的意思就成了,從地址40000拷貝4個(gè)字節(jié)到變量k所在的內(nèi)存中。由于地址40000所在的內(nèi)存我們無(wú)權(quán)訪(fǎng)問(wèn),操作系統(tǒng)會(huì)給我們一個(gè)Access Violation內(nèi)存越權(quán)訪(fǎng)問(wèn)錯(cuò)誤,告訴我們"試圖讀取位置0x00009c40處內(nèi)存時(shí)出錯(cuò),該內(nèi)存不能為'Read'"。
    我們?cè)俑某扇缦碌恼Z(yǔ)句看看。
Note3:   CopyMemory VarPtr(k), 40000, 4
    這句話(huà)的意思就成了,從保存常數(shù)40000的臨時(shí)變量處拷貝4個(gè)字節(jié)到到保存變量k所在內(nèi)存地址值的臨時(shí)變量處。這不會(huì)出出內(nèi)存越權(quán)訪(fǎng)問(wèn)錯(cuò)誤,但k的值并沒(méi)有變。
    我們可以把程序改改以更清楚的休現(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的值卻沒(méi)有變化。但是,在NOTE4前有:i=VarPtr(k),本意是要把i本身做為一個(gè)指針來(lái)使用。這時(shí),我們必須如NOTE5那樣用ByVal來(lái)傳遞指針i,由于i是指向變量k的指針,所以最后常量40000被
您可能感興趣的文章:
  • JavaScript 函數(shù)參數(shù)是傳值(byVal)還是傳址(byRef) 分享
  • Asp中通過(guò)簡(jiǎn)單的例子理解下ByVal和ByRef的用法
  • vbs(asp) ByVal ByRef函數(shù)調(diào)用使用說(shuō)明
  • 關(guān)于 byval 與 byref 的區(qū)別分析總結(jié)
  • asp中Byval與Byref的區(qū)別
  • .Net 下區(qū)別使用 ByRef/ByVal 的重要性 分享

標(biāo)簽:廣元 棗莊 萍鄉(xiāng) 蚌埠 大理 江蘇 衢州 衡水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ByVal和ByRef(編寫(xiě)ASP子程序所用到命令)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話(huà)咨詢(xún)

    • 400-1100-266
    文水县| 高邮市| 樟树市| 万山特区| 东海县| 巴彦淖尔市| 郧西县| 云浮市| 岢岚县| 福贡县| 常德市| 北辰区| 古丈县| 化隆| 图们市| 百色市| 白山市| 平江县| 英吉沙县| 安阳县| 日土县| 襄垣县| 周口市| 安多县| 富顺县| 西和县| 阿拉善左旗| 保靖县| 太和县| 荆州市| 根河市| 斗六市| 河北省| 武隆县| 虞城县| 阜南县| 古丈县| 南木林县| 双城市| 厦门市| 陆河县|