| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 838 人关注过本帖
标题:VB指针教程3
取消只看楼主 加入收藏
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
结帖率:78.95%
收藏
 问题点数:0 回复次数:1 
VB指针教程3
演示工程下载:
demo6.rar (449.98 KB)

'其它章节链接地址
'VB指针教程1:https://bbs.bccn.net/thread-305122-1-1.html
'VB指针教程2:https://bbs.bccn.net/thread-305236-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
'如有谬误之处请各位指出,谢谢!


 

[ 本帖最后由 ioriliao 于 2010-5-14 22:55 编辑 ]
搜索更多相关主题的帖子: 指针 教程 
2010-05-14 22:51
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
收藏
得分:0 
如果有不明白的请发问哦,我会尽我所能回答。。。

/images/2011/147787/2011051411021524.jpg" border="0" />
2010-05-15 21:00
快速回复:VB指针教程3
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019596 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved