VB.NET指针在实际应用中作用体现

开发 后端
要想彻底掌握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函数,就是将两段内存空间进行复制操作。它的声明是这样的:

 

  1. Public Declare Sub CopyMemory Lib 
    "kernel32" Alias "RtlMoveMemory" 
    (Destination As Any, Source As 
    Any, ByVal Length As Long)
     函数原型   
  2. VOID CopyMemory(  
  3. PVOID Destination,   
  4. CONST VOID *Source,   
  5. DWORD Length   
  6. ); 

 

第一个参数:目的地址指针

第二个参数:源地址指针

第三个参数:复制的大小

请注意,在CopyMemory的VB声明中,传递的源与目的是Any类型,也就是说可以是任何类型的变量。

B、如何用VB指针

1、如何取得数组的指针

请看如下程序:

  1. pOutputArray As Long 
    outputArray()   
  2. As Byte ReDim 
    outputArray(100)   
  3. As Byte pOutputArray =
     
    VarPtr(outputArray(0)) 

说明:

我们声明了一个Byte数组outputArray,用VarPtr函数,取出数组的指针赋给了Long型变量pOutputArray。

2、如何将指针所指向的数组取出来

请看如下程序:

 

  1. CopyMemory ByVal pOutputArray, 
    ByVal pData, UBound(outputArray) 

说明:

pData是一个内存块的指针,通过这句话的执行,我们得到了pData指向的内存区域中的数据到pOutputArray数组中。

三、高级应用:取得函数的VB.NET指针

有时候,系统函数库调用中会要求有回调函数,而将回调函数以参数进行传递时,并不能传入回调函数名,而是需要将回调函数的地址传参,这时候,我们就需要得到回调函数的地址。在这里我只给出例子代码,有兴趣的朋友可以去研究。

  1. Public Sub RegisterWinProc
    (ByVal hwnd As Long)   
  2. '传入hWnd是本窗口的句柄   
  3. 'GetWindowLong从指定窗口的
    结构中取得信息   
  4. prevWndProc = GetWindowLong
    (hwnd, GWL_WNDPROC)   
  5. 'SetWindowLong在窗口结构中为
    指定的窗口设置信息   
  6. SetWindowLong hwnd, GWL_
    WNDPROC, AddressOf   
  7. WndProc DesthWnd = hwnd   
  8. End Sub  

四、结束语

大家看,VB.NET指针在进行实际操作的时候,只要掌握了相应的方法,是不是VC在这时候也就黯然失色了呢?

责任编辑:曹凯 来源: 中国IT实验室
相关推荐

2010-01-15 13:30:53

VB.NET Tool

2010-01-08 18:02:33

VB.NET事件

2010-01-19 15:21:55

VB.NET区域性

2010-01-11 16:15:13

VB.NET枚举功能

2010-01-20 18:34:46

VB.NET Syst

2010-01-07 16:16:03

VB.NET变量作用域

2010-01-21 16:30:58

VB.NET对象浏览器

2010-01-15 10:32:06

VB.NET继承

2010-01-14 13:27:33

VB.NET操作符li

2009-11-10 16:46:52

VB.NET指针应用

2010-02-06 09:01:58

ViewState

2009-11-10 16:27:45

VB.NET指针

2010-02-25 17:22:39

WCF服务行为

2010-01-07 18:17:00

VB.NET连接SAP

2010-01-20 18:45:44

VB.NET DoEv

2010-01-08 15:22:22

VB.NET局部变量

2010-01-18 17:37:32

VB.NET文本框处理

2009-12-24 14:30:56

VB.NET

2010-01-21 17:34:48

VB.NET Bool

2009-10-14 15:20:21

VB.NET窗体指针
点赞
收藏

51CTO技术栈公众号