溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

VB.NET指針怎么應(yīng)用

發(fā)布時(shí)間:2021-12-02 13:52:40 來(lái)源:億速云 閱讀:249 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹了VB.NET指針怎么應(yīng)用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

VB里使用指針不象C里那樣靈活,用指針處理數(shù)據(jù)時(shí)都需要用CopyMemory將數(shù)據(jù)在指針和VB能夠處理的變量之間來(lái)回拷貝,這需要很大的額外開(kāi)銷。因此不是所有C里的指針操作都可以移值到VB里來(lái),我們只應(yīng)在需要的時(shí)候才在VB里使用指針。

1、VB.NET指針應(yīng)用動(dòng)態(tài)內(nèi)存分配:完全不可能、可能但不可行,VB標(biāo)準(zhǔn)

在C和C++里頻繁使用指針的一個(gè)重要原因是需要使用動(dòng)態(tài)內(nèi)存分配,用Malloc或New來(lái)從堆棧里動(dòng)態(tài)分配內(nèi)存,并得到指向這個(gè)內(nèi)存的指針。在VB里我們也可以自己用API來(lái)實(shí)現(xiàn)動(dòng)態(tài)分配內(nèi)存,并且實(shí)現(xiàn)象C里的指針鏈表。

但我們不可能象C那樣直接用指針來(lái)訪問(wèn)這樣動(dòng)態(tài)分配的內(nèi)存,訪問(wèn)時(shí)我們必須用CopyMemory將數(shù)據(jù)拷貝到VB的變量?jī)?nèi),大量的使用這種技術(shù)必然會(huì)降低效率,以至于要象C那樣用指針來(lái)使用動(dòng)態(tài)內(nèi)存根本就沒(méi)有可行性。要象C、PASCAL那樣實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),在VB里還是應(yīng)該老老實(shí)實(shí)用對(duì)象技術(shù)來(lái)實(shí)現(xiàn)。

本文配套代碼中的LinkedList里有完全用指針實(shí)現(xiàn)的鏈表,它是使用HeapAlloc從堆棧中動(dòng)態(tài)分配內(nèi)存,另有一個(gè)調(diào)用FindFirstUrlCacheEntry這個(gè)API來(lái)操作IE的Cache的小程序IECache,它使用了VirtualAlloc來(lái)動(dòng)態(tài)分配內(nèi)存。但實(shí)際上這都不是必須的,VB已經(jīng)為我們提供了標(biāo)準(zhǔn)的動(dòng)態(tài)內(nèi)存分配的方法,那就是:對(duì)象、字符串和字節(jié)數(shù)組限于篇幅,關(guān)于對(duì)象的技術(shù)這里不講,LinkedList的源代碼里有用對(duì)象實(shí)現(xiàn)的鏈表,你可以參考。字符串可以用Space$函數(shù)來(lái)動(dòng)態(tài)分配,VB的文檔里就有詳細(xì)的說(shuō)明。關(guān)于字節(jié)數(shù)組,這里要講講,它非常有用。我們可用Redim來(lái)動(dòng)態(tài)改變它的大小,并將指向它***個(gè)元素的指針傳給需要指針的API,如下:

dim ab() As Byte , ret As long  '傳遞Null值A(chǔ)PI會(huì)返回它所需要的緩沖區(qū)的長(zhǎng)度。  ret = SomeApiNeedsBuffer(vbNullString)  '動(dòng)態(tài)分配足夠大小的內(nèi)存緩沖區(qū)  ReDim ab(ret) As Byte  '再次把指針傳給API,此時(shí)傳字節(jié)數(shù)組***個(gè)元素的指針。  SomeApiNeedsBuffer(ByVal VarPtr(ab(1)))

在本文配套程序中的IECache中,我也提供了用字節(jié)數(shù)組來(lái)實(shí)現(xiàn)動(dòng)態(tài)分配緩沖區(qū)的版本,比用VirtualAlloc來(lái)實(shí)現(xiàn)更安全更簡(jiǎn)單。

2、VB.NET指針應(yīng)用突破限制

下面是一個(gè)突破VB類型檢查來(lái)實(shí)現(xiàn)特殊功能的經(jīng)典應(yīng)用,出自Bruce Mckinney的《HardCore Visual Basic》一書(shū)。

將一個(gè)Long長(zhǎng)整數(shù)的低16位作為Interger型提取出來(lái),

'標(biāo)準(zhǔn)的方法,也是高效的方法,但不容易理解。  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   '用指針來(lái)做效率雖不高,但思想清楚。  Function LoWord(ByVal dw As Long) As Integer  CopyMemory ByVal VarPtr(LoWord), ByVal VarPtr(dw), 2  End Function

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“VB.NET指針怎么應(yīng)用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI