VB无所不能之指针介绍

开发 后端
本文对VB指针的用法做出了详细的说明。VB中为什么使用指针呢?一是为了数据操作速度的需求,二是考虑到在对系统库函数的调用时需要进行的指针的传参。

一、为什么VB要用指针:

C/C++中都可以操作指针,用指针可以很方便的访问到内存区域,C++中的指针其实就是数组的一个访问方式而已,由于其使用比较方便,可以非常方便的进行对内存区域的赋值与读取操作,因此,用惯了C++的程序员乐此不疲。

其实,我们在用VB开发一般程序的时候是没有必要用指针去访问内存某区域的。因为VB为我们提供了一个非常方便的访问方法——就是VB的数组。用数组可以很方便的使用一组数据。然而,为什么,在VB中我们非要去实现指针的操作呢?

 1、数据操作速度的需求

 比如,需要针对两个数组之间的复制操作,需要给数组做一个循环,然后在逐个的添加到新的数组中,用指针的方法速度会快很多。

 2、在对系统库函数的调用时

 Windows中的User32.dll\GDI32.dll\Kernel32.dll等这些系统库函数中,很多都是接收指针参数的,因此,如果VB需要调用这些函数的时候,就必须要进行指针的传参。

二、VB怎么用指针

要想弄明白VB怎么使用指针,就必须要弄明白两件事,第一,如何取得数组的指针,第二,如何将指针所指向的数组取出来。

A、在讲解这两个问题之前,我们需要了解几个问题:

1、VB的数组与C++的数组的区别

有可能,大家现在认为VB的数组和C++的数组没有任何区别,都是内存中的一段地址而已,其实不然。

C++中是真的数组,真的是一段地址,而且,当你的指针访问超出了数组的范围,也没人理你,只是很容易导致系统崩溃而已。

而VB数组其实是一个结构体,在这个结构体中包含了关于这个数组的描述信息,其结构类似如下:

  1. Private Type VB数组  
  2.    数组维数  
  3.    数组大小  
  4.    真实的数组  
  5. 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

  函数原型

  VOID CopyMemory(

  PVOID Destination,

  CONST VOID *Source,

  DWORD Length

  );

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

第二个参数:源地址指针

第三个参数:复制的大小

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

B、如何用VB指针

1、如何取得数组的指针

请看如下程序:

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

说明:

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

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

请看如下程序:

CopyMemory ByVal pOutputArray, ByVal pData, UBound(outputArray)

说明:

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

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

有时候,系统函数库调用中会要求有回调函数,而将回调函数以参数进行传递时,并不能传入回调函数名,而是需要将回调函数的地址传参,这时候,我们就需要得到回调函数的地址。

在这里我只给出例子代码,有兴趣的朋友可以去研究。

  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 WndProc  
  7. DesthWnd = hwnd  
  8. End Sub 

四、结束语

大家看,VB在处理指针的时候,只要掌握了相应的方法,是不是VC在这时候也就黯然失色了呢?

本文出自 “《Java程序员,上班那点事儿》的那点事儿” 博客。

【编辑推荐】

  1. OO世界中的核心概念 .NET中的多态
  2. ASP.NET开发程序过程中值得注意的两个地方
  3. 全面总结.NET 4.0新特性:C#和VB.NET的取长补短
  4. 深入理解Java多态性
  5. ASP.NET的错误处理机制
责任编辑:yangsai 来源: 51CTO博客
相关推荐

2021-04-07 10:02:18

人工智能技术互联网

2013-05-22 14:05:18

2013-12-18 10:32:20

mcollectiveshellpuppet

2015-04-30 14:53:43

Build 2015微软Azure

2015-10-28 15:47:22

谷歌物联网互联网

2023-11-28 12:09:43

Linux网络工具

2021-08-16 10:13:26

AI DeepMind人工智能

2021-04-17 23:05:29

手机黑科技APP

2014-06-13 02:21:14

2019-12-19 14:17:11

以太坊去中心化加密货币

2013-04-09 14:23:12

3D打印

2020-03-09 10:43:28

人工智能疫情机器人

2014-03-11 23:02:00

2023-09-07 07:08:49

ChatGPTAI节点

2021-02-07 00:29:14

支付宝互联网返乡隔离政策

2011-09-12 15:32:58

2023-09-06 06:38:18

AMDCPUGPU

2021-04-05 22:37:29

微信小程序手机

2012-06-18 16:21:00

华硕无线路由RT-N15U

2021-07-30 15:50:54

Python定时器JavaScrip
点赞
收藏

51CTO技术栈公众号