先說說自己在實踐中遇到什么問題了。
dim bytSend(2) as byte
bytSend(0) = &H35
bytSend(1) = &H30
bytSend(2) = &H30
SendMessage htxt, WM_SETTEXT, 0, bytSend(0)
dim strSend as string
strsend="500"
SendMessage htxt, WM_SETTEXT, 0, byval strsend
以上這兩段代碼執(zhí)行的效果是一樣的,不是很理解,誰能幫我解釋一下?一般byval是用在形參前,這里用在實參前,有什么特殊意義嗎?
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)這是SendMessage的原型
Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)這是VB中的聲明
這里調用的含義,當是定義的字符數組時,按地址傳遞,第一個元素傳遞過去是首地址,類似指針的運行;當是字符串傳遞,必須按值傳遞,傳遞過去還是分成了字符數組進行處理,就像c語言中字符串與字符數組的關系……不知道這樣理解對不對
以前我很多地方用到過第一種方式,不知道是不是都可以換成第二種方式,如果不行,是為什么?
這里我分為三層進行理解:
第一層:表層的一個認識,msdn上說的Byval按值傳遞,Byref按地址傳遞,我們就可以這樣理解,按值傳遞就是僅僅傳遞的是值過去,所以沒有任何的影響原來的數據;按地址傳遞,就想當與調用的函數改變的也是這個值。例如:
sub Wrap(byref a as interger,byval b as interger)'兩個數交換
a=a+b
b=a-b
a=a-b
end sub
a=5:b=7
print a & "," & b'輸出 5,7
call wrap(a,b)
print a & "," & b'輸出 7,7(a變了,b沒有變)
第二層:計算機函數的執(zhí)行就真的是上面那個簡單嗎?肯定不是,那么我們繼續(xù)看看它到底是怎樣運行的,我們知道所有處理的數據在計算機運行是放在內存中的,當創(chuàng)建變量后就給變量分配了一個類型空間,例如上例中的實參a,b。a這個變量是有一個指針指向的,我們假設為pa,傳遞給形參時,傳遞的是這一個指針,于是形參a有值了,就是pa指向的內存里的值,即實參a和形參a共用一個指針,共用一個內存單元;實參b有一個指針我們假設為pb1,它在傳遞時計算機認出是按值傳遞,就建立一個跟實參變量b同樣大小的內存空間,將b的內容拷入,這個空間也有一個指針,我們假設為pb2,調用過程時,形參被賦予內容,它的內容就是pb2所指向的內存中的內容。這就是傳遞參數的實際情況,當處理時,pa和pb2指向的內存中的數據都發(fā)生了變化,但是pb1內的數據沒有發(fā)生變化,所以這里我們就明白了為什么a發(fā)生了變化,但是b沒有變換的原因。
第三層:參數傳遞過程中還有各種各樣的數據類型限制是為了什么?同第二層的說明,比如我在主程序中是int型,用到的是16位,在調用的形參中是使用的32位變量,這樣他們處理的時候在內存中讀取的數據就不一樣了,16位存儲兩個字節(jié)空間,32位獲取4個字節(jié)空間,這樣處理出來的數據就非我們本意了,所以必須要有數據限制。
這三層得到了理解,上面我提出的問題應該也能完全的認識了,在應用的時候我們可以進行靈活的設置!?。?!
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請
點擊舉報。