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