自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

全面攻略VB.NET指針應(yīng)用

開發(fā) 后端
文章就VB.NET指針應(yīng)用動態(tài)內(nèi)存分配:完全不可能、可能但不可行,VB標準、突破限制兩方面做出詳細的介紹,希望對大家有幫助。

經(jīng)過長時間學(xué)習(xí)VB.NET,于是和大家分享一下VB.NET指針應(yīng)用,看完本文你肯定有不少收獲,希望本文能教會你更多東西。VB里使用指針不象C里那樣靈活,用指針處理數(shù)據(jù)時都需要用CopyMemory將數(shù)據(jù)在指針和VB能夠處理的變量之間來回拷貝,這需要很大的額外開銷。因此不是所有C里的指針操作都可以移值到VB里來,我們只應(yīng)在需要的時候才在VB里使用指針。

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

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

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

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

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

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

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

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

將一個Long長整數(shù)的低16位作為Interger型提取出來,

  1. '標準的方法,也是高效的方法,但不容易理解。  
  2. Function LoWord(ByVal dw As Long) As Integer  
  3. If dw And &H8000& Then  
  4. LoWord = dw Or &HFFFF0000  
  5. Else  
  6. LoWord = dw And &HFFFF&  
  7. End If  
  8. End Function  
  9.  
  10. '用指針來做效率雖不高,但思想清楚。  
  11. Function LoWord(ByVal dw As Long) As Integer  
  12. CopyMemory ByVal VarPtr(LoWord), ByVal VarPtr(dw), 2  
  13. End Function  
責(zé)任編輯:田樹 來源: 博客
相關(guān)推薦

2009-10-14 15:20:21

VB.NET窗體指針

2009-11-02 15:57:36

VB.NET WEB

2009-10-28 17:44:31

VB.NET語言

2009-10-28 10:04:53

VB.NET XmlW

2010-01-14 10:35:34

VB.NET指針

2009-10-27 12:20:06

VB.NET多線程應(yīng)用

2009-11-02 14:48:45

VB.NET HOOK

2009-10-15 11:42:05

VB.Net賦值語句

2009-10-15 10:57:16

VB.NET Text

2009-11-04 10:54:53

VB.NET MOVE

2009-10-29 15:16:02

VB.NET文件傳送

2009-10-27 09:01:54

VB.NET內(nèi)存指針

2010-01-12 16:20:44

VB.NET類

2009-10-09 15:59:41

VB.NET對象

2009-10-20 17:38:20

VB.NET exce

2009-11-10 16:20:25

VB.NET全局熱鍵

2009-10-29 11:26:28

VB.NET調(diào)用Web

2009-10-27 09:45:03

VB.NET數(shù)組

2009-10-15 17:50:48

VB.NET調(diào)用API

2009-10-30 13:48:36

VB.NET指針
點贊
收藏

51CTO技術(shù)棧公眾號