VBA指针Pointer
时间:2022-07-22
本文章向大家介绍VBA指针Pointer,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
如果你想深入的了解VBA内部数据类型的内存布局,就必然需要知道变量所在的内存地址,VBA有3个取变量地址函数:
1、VarPtr
定义1个变量,函数返回这个变量的地址。
这个变量可以是任何类型(不能是数组)。
2、StrPtr
定义1个String类型
- 初始化前,函数返回0,这个时候还没有字符的内存地址,所以是0
- 初始化后,函数返回字符所在的内存地址(假设是ps)
与VarPtr得到的变量地址(假设是pv)关系是,pv这个地址保存的4个字节(32位电脑)的值就是ps。
Sub TestString()
Dim str As String
Dim lVarPtr As Long
str = "a"
CopyMemory VarPtr(lVarPtr), VarPtr(str), 4
printf "VarPtr(str) = 0x%x, StrPtr(str) = 0x%x, lVarPtr = 0x%x", VarPtr(str), StrPtr(str), lVarPtr
End Sub
输出:
VarPtr(str) = 0x1ef030, StrPtr(str) = 0x17a455ec, lVarPtr = 0x17a455ec
说明:
API CopyMemory 声明
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
printf 是自己封装的1个函数,代码没有列出
所以从上面可以看出,StrPtr就是把VarPtr得到的pv这个指针保存的内存数据读取出来。
也就是对String类型来说,其实有VarPtr就能够间接获取Str的字符所在地址,于是就想到尝试用StrPtr对数据类型的变量使用是不是也是一样的效果?
Sub TestStrPtr()
Dim l As Long
printf "VarPtr(l) = 0x%x, StrPtr(l) = 0x%x", VarPtr(l), StrPtr(l)
End Sub
输出:
VarPtr(l) = 0x1ef030, StrPtr(l) = 0x17a455ec
本以为在变量l未初始化也就是0的时候,StrPtr(l)应该返回0才对,为什么返回了一个值?这个如果也是个内存地址的话,里面又保存了什么?
Sub TestStrPtr()
Dim l As Long
printf "VarPtr(l) = 0x%x, StrPtr(l) = 0x%x", VarPtr(l), StrPtr(l)
Dim b(3) As Byte
CopyMemory VarPtr(b(0)), ByVal StrPtr(l), 4
printf "b = 0x% x", b
End Sub
输出:
VarPtr(l) = 0x1ef030, StrPtr(l) = 0x118c6a5c
b = 0x30 00 00 00
输出的这个值还挺特殊!变量l赋值的话输出也会变化,不懂为什么!待研究……3、ObjPtr
这个和StrPtr好像差不多,VarPtr(obj)得到的地址po,po内存保存的数据等于ObjPtr(obj)
Sub TestObjPtr()
Dim Rng As Range
Dim lVarPtr As Long
Set Rng = Range("A1")
CopyMemory VarPtr(lVarPtr), VarPtr(Rng), 4
printf "VarPtr(Rng) = 0x%x, ObjPtr(Rng) = 0x%x, lVarPtr = 0x%x", VarPtr(Rng), ObjPtr(Rng), lVarPtr
End Sub
输出:
VarPtr(Rng) = 0x1ef030, ObjPtr(Rng) = 0x8189280, lVarPtr = 0x8189280
- 理解Go语言Web编程(上)
- 理解Go语言Web编程(下)
- 呆呆的io流输入输出的一些基础
- 机器人 Go 语言库:Gobot
- poj------2406 Power Strings
- 使用Django基础模板搭建自己的知识库
- Go 语言编写的缓存及缓存过滤库:groupcache
- 异常处理机制
- 【实战】重现DeepMind星际争霸强化学习算法
- javasE学习笔记:关键字super的使用
- uva------Help is needed for Dexter(11384)
- Uva---10881 Piotr's Ants(蚂蚁)
- javaSE基础之基本细节注解
- javaSE基础——常见的dos命令即其他
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法