VB指针教程3

作者在 2010-05-14 23:02:13 发布以下内容
演示工程代码下载:http://bbs.bccn.net/thread-306717-1-1.html
 
'如果遇到不会的知识点请参考上面的教程
'
这一节我们来探讨下VB的字符串及字符串指针。
'
VB的字符串类型其实是BSTR类型,是"Basic STRing"的简称,微软在COM/OLE中定义的标准字符串数据类型。
'
BSTR类型的结构如下
Private Type S_String
    WordLen As Long    '存放字符串的字节数
    pData() As Integer '存放指向字符串的指针(即地址)
    WordEnd As Integer '存放结束字符(即chr(0))
End Type

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

'字符串在VB中的存储结构如下


Private Sub Form_Click()
    'StrPtr函数:返回真正的UNICODE字符串缓冲区的地址
    Dim str As String
    str = "any string"
    Dim i As Long
    Print "VarPtr(str)=" & VarPtr(str) & " 字符串变量的地址"
    Print "StrPrt(str)=" & StrPtr(str) & " 字符串的地址"
  
    CopyMemory i, ByVal VarPtr(str), 4
    Print "i=" & i & " 是字符串变量的地址所指向的值,它的值刚好是字符串的地址。"
    Print "从运行结果可以看出字符串变量的地址 VarPtr(str) 与字符串地址 StrPtr(str) 的区别。"
    Print "就是说字符串变量的地址VarPtr(str)存放着一个地址,这个地址就是字符串的地址,等价于StrPtr(str)"
    Print "那么我们就很容易理解为什么利用CopyMemory函数复制一个字符串到另一个字符串变量时参数是按值传递的"
    Print "读者可能会觉得奇怪,按值传递不就是把字符串传入去?CopyMemoy参数不是要求我们传递地址入去吗?"
    Print "没错,但不要忘记字符串的本质就是一个指针,指针就是地址。"
    Dim s2 As String
    s2 = String$(Len(str), 0)
    CopyMemory ByVal s2, ByVal str, Len(str)
    Print "s2=" & s2
  
    Dim strLen As Long
    CopyMemory strLen, ByVal StrPtr(str) - 4, 4
    Print "strLen=" & strLen; " 这是字符串的字节数"
    Print "从结果可以看出是与字符串的存储结构对应的"
    Print "利用这个性质,我们以模拟一下LenB函数和Len函数,分别为MyLenB、MyLen"
    Print "MyLenB(str)=" & MyLenB(str)
    Print "MyLen(str)=" & MyLen(str)
  
    Print "我们现在验证一下字符串存储结构中的WordEnd所存的是不是一个结束字符chr(0)"
    Dim we As Integer
    CopyMemory wn, ByVal StrPtr(str) + LenB(str), 2
    Print "we=" & we
End Sub

Private Function MyLenB(str As String) As Long
     CopyMemory MyLenB, ByVal StrPtr(str) - 4, 4
End Function

Private Function MyLen(str As String) As Long
    CopyMemory MyLen, ByVal StrPtr(str) - 4, 4
    MyLen = MyLen / 2
End Function
'如有谬误之处请各位指出,谢谢!
VB指针教程 | 阅读 1224 次
文章评论,共0条
游客请输入验证码
浏览29332次