前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VBA指针Pointer

VBA指针Pointer

作者头像
xyj
发布2020-07-28 10:21:27
1.1K0
发布2020-07-28 10:21:27
举报
文章被收录于专栏:VBA 学习VBA 学习

如果你想深入的了解VBA内部数据类型的内存布局,就必然需要知道变量所在的内存地址,VBA有3个取变量地址函数:

1、VarPtr

定义1个变量,函数返回这个变量的地址。

这个变量可以是任何类型(不能是数组)。

2、StrPtr

定义1个String类型

  • 初始化前,函数返回0,这个时候还没有字符的内存地址,所以是0
  • 初始化后,函数返回字符所在的内存地址(假设是ps)

与VarPtr得到的变量地址(假设是pv)关系是,pv这个地址保存的4个字节(32位电脑)的值就是ps。

代码语言:javascript
复制
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对数据类型的变量使用是不是也是一样的效果?

代码语言:javascript
复制
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才对,为什么返回了一个值?这个如果也是个内存地址的话,里面又保存了什么?

代码语言:javascript
复制
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)

代码语言:javascript
复制
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
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 VBA 学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如果你想深入的了解VBA内部数据类型的内存布局,就必然需要知道变量所在的内存地址,VBA有3个取变量地址函数:
  • 1、VarPtr
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档