您好,登錄后才能下訂單哦!
這篇文章主要介紹了VB.NET指針怎么應用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
VB里使用指針不象C里那樣靈活,用指針處理數據時都需要用CopyMemory將數據在指針和VB能夠處理的變量之間來回拷貝,這需要很大的額外開銷。因此不是所有C里的指針操作都可以移值到VB里來,我們只應在需要的時候才在VB里使用指針。
1、VB.NET指針應用動態內存分配:完全不可能、可能但不可行,VB標準
在C和C++里頻繁使用指針的一個重要原因是需要使用動態內存分配,用Malloc或New來從堆棧里動態分配內存,并得到指向這個內存的指針。在VB里我們也可以自己用API來實現動態分配內存,并且實現象C里的指針鏈表。
但我們不可能象C那樣直接用指針來訪問這樣動態分配的內存,訪問時我們必須用CopyMemory將數據拷貝到VB的變量內,大量的使用這種技術必然會降低效率,以至于要象C那樣用指針來使用動態內存根本就沒有可行性。要象C、PASCAL那樣實現動態數據結構,在VB里還是應該老老實實用對象技術來實現。
本文配套代碼中的LinkedList里有完全用指針實現的鏈表,它是使用HeapAlloc從堆棧中動態分配內存,另有一個調用FindFirstUrlCacheEntry這個API來操作IE的Cache的小程序IECache,它使用了VirtualAlloc來動態分配內存。但實際上這都不是必須的,VB已經為我們提供了標準的動態內存分配的方法,那就是:對象、字符串和字節數組限于篇幅,關于對象的技術這里不講,LinkedList的源代碼里有用對象實現的鏈表,你可以參考。字符串可以用Space$函數來動態分配,VB的文檔里就有詳細的說明。關于字節數組,這里要講講,它非常有用。我們可用Redim來動態改變它的大小,并將指向它***個元素的指針傳給需要指針的API,如下:
dim ab() As Byte , ret As long '傳遞Null值API會返回它所需要的緩沖區的長度。 ret = SomeApiNeedsBuffer(vbNullString) '動態分配足夠大小的內存緩沖區 ReDim ab(ret) As Byte '再次把指針傳給API,此時傳字節數組***個元素的指針。 SomeApiNeedsBuffer(ByVal VarPtr(ab(1)))
在本文配套程序中的IECache中,我也提供了用字節數組來實現動態分配緩沖區的版本,比用VirtualAlloc來實現更安全更簡單。
2、VB.NET指針應用突破限制
下面是一個突破VB類型檢查來實現特殊功能的經典應用,出自Bruce Mckinney的《HardCore Visual Basic》一書。
將一個Long長整數的低16位作為Interger型提取出來,
'標準的方法,也是高效的方法,但不容易理解。 Function LoWord(ByVal dw As Long) As Integer If dw And &H8000& Then LoWord = dw Or &HFFFF0000 Else LoWord = dw And &HFFFF& End If End Function '用指針來做效率雖不高,但思想清楚。 Function LoWord(ByVal dw As Long) As Integer CopyMemory ByVal VarPtr(LoWord), ByVal VarPtr(dw), 2 End Function
感謝你能夠認真閱讀完這篇文章,希望小編分享的“VB.NET指針怎么應用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。