VB.NET指針在實(shí)際應(yīng)用中作用體現(xiàn)
有些語言比如C語言中,存在有指針。很多人在學(xué)習(xí)編程語言的時(shí)候,碰到指針的問題都是非常頭疼的。那么VB.NET指針又會(huì)呈現(xiàn)出一個(gè)什么樣的情況呢?我們是不是可以很方便的的使用這一操作呢?#t#
一、為什么要使用VB.NET指針:
C/C++中都可以操作指針,用指針可以很方便的訪問到內(nèi)存區(qū)域,C++中的指針其實(shí)就是數(shù)組的一個(gè)訪問方式而已,由于其使用比較方便,可以非常方便的進(jìn)行對(duì)內(nèi)存區(qū)域的賦值與讀取操作,因此,用慣了C++的程序員樂此不疲。
其實(shí),我們?cè)谟肰B開發(fā)一般程序的時(shí)候是沒有必要用指針去訪問內(nèi)存某區(qū)域的。因?yàn)閂B為我們提供了一個(gè)非常方便的訪問方法——就是VB的數(shù)組。用數(shù)組可以很方便的使用一組數(shù)據(jù)。然而,為什么,在VB中我們非要去實(shí)現(xiàn)指針的操作呢?
1、數(shù)據(jù)操作速度的需求
比如,需要針對(duì)兩個(gè)數(shù)組之間的復(fù)制操作,需要給數(shù)組做一個(gè)循環(huán),然后在逐個(gè)的添加到新的數(shù)組中,用指針的方法速度會(huì)快很多。
2、在對(duì)系統(tǒng)庫函數(shù)的調(diào)用時(shí)
Windows中的User32.dll\GDI32.dll\Kernel32.dll等這些系統(tǒng)庫函數(shù)中,很多都是接收指針參數(shù)的,因此,如果VB需要調(diào)用這些函數(shù)的時(shí)候,就必須要進(jìn)行指針的傳參。
二、VB.NET指針怎么用
要想弄明白VB怎么使用指針,就必須要弄明白兩件事,第一,如何取得數(shù)組的指針,第二,如何將指針?biāo)赶虻臄?shù)組取出來。
A、在講解這兩個(gè)問題之前,我們需要了解幾個(gè)問題:
1、VB的數(shù)組與C++的數(shù)組的區(qū)別
有可能,大家現(xiàn)在認(rèn)為VB的數(shù)組和C++的數(shù)組沒有任何區(qū)別,都是內(nèi)存中的一段地址而已,其實(shí)不然。
C++中是真的數(shù)組,真的是一段地址,而且,當(dāng)你的指針訪問超出了數(shù)組的范圍,也沒人理你,只是很容易導(dǎo)致系統(tǒng)崩潰而已。
而VB數(shù)組其實(shí)是一個(gè)結(jié)構(gòu)體,在這個(gè)結(jié)構(gòu)體中包含了關(guān)于這個(gè)數(shù)組的描述信息,其結(jié)構(gòu)類似如下:
Private Type VB數(shù)組 數(shù)組維數(shù) 數(shù)組大小 真實(shí)的數(shù)組 End Type 2、Copymemory系統(tǒng)函數(shù)
這個(gè)函數(shù)有點(diǎn)像Java中的ArrayCopy函數(shù),就是將兩段內(nèi)存空間進(jìn)行復(fù)制操作。它的聲明是這樣的:
- Public Declare Sub CopyMemory Lib
"kernel32" Alias "RtlMoveMemory"
(Destination As Any, Source As
Any, ByVal Length As Long)
函數(shù)原型- VOID CopyMemory(
- PVOID Destination,
- CONST VOID *Source,
- DWORD Length
- );
第一個(gè)參數(shù):目的地址指針
第二個(gè)參數(shù):源地址指針
第三個(gè)參數(shù):復(fù)制的大小
請(qǐng)注意,在CopyMemory的VB聲明中,傳遞的源與目的是Any類型,也就是說可以是任何類型的變量。
B、如何用VB指針
1、如何取得數(shù)組的指針
請(qǐng)看如下程序:
- pOutputArray As Long
outputArray()- As Byte ReDim
outputArray(100)- As Byte pOutputArray =
VarPtr(outputArray(0))
說明:
我們聲明了一個(gè)Byte數(shù)組outputArray,用VarPtr函數(shù),取出數(shù)組的指針賦給了Long型變量pOutputArray。
2、如何將指針?biāo)赶虻臄?shù)組取出來
請(qǐng)看如下程序:
- CopyMemory ByVal pOutputArray,
ByVal pData, UBound(outputArray)
說明:
pData是一個(gè)內(nèi)存塊的指針,通過這句話的執(zhí)行,我們得到了pData指向的內(nèi)存區(qū)域中的數(shù)據(jù)到pOutputArray數(shù)組中。
三、高級(jí)應(yīng)用:取得函數(shù)的VB.NET指針
有時(shí)候,系統(tǒng)函數(shù)庫調(diào)用中會(huì)要求有回調(diào)函數(shù),而將回調(diào)函數(shù)以參數(shù)進(jìn)行傳遞時(shí),并不能傳入回調(diào)函數(shù)名,而是需要將回調(diào)函數(shù)的地址傳參,這時(shí)候,我們就需要得到回調(diào)函數(shù)的地址。在這里我只給出例子代碼,有興趣的朋友可以去研究。
- Public Sub RegisterWinProc
(ByVal hwnd As Long)- '傳入hWnd是本窗口的句柄
- 'GetWindowLong從指定窗口的
結(jié)構(gòu)中取得信息- prevWndProc = GetWindowLong
(hwnd, GWL_WNDPROC)- 'SetWindowLong在窗口結(jié)構(gòu)中為
指定的窗口設(shè)置信息- SetWindowLong hwnd, GWL_
WNDPROC, AddressOf- WndProc DesthWnd = hwnd
- End Sub
四、結(jié)束語
大家看,VB.NET指針在進(jìn)行實(shí)際操作的時(shí)候,只要掌握了相應(yīng)的方法,是不是VC在這時(shí)候也就黯然失色了呢?