VB中CopyMemory函数

VB中CopyMemory函数vb 中 copymemory 函数的使用挺耐人寻味的 copymemory 的使用说明资料书上就一句 该函数用于将一块内存的数据从一个位置复制到另一个位置 其参数数据类型 destinationa sourceasany 尽管是 any 型可理解成任一类型但是我看很多地方都说参数是指针类型的 因此起初我很不解 既然是指针型的参数我们往往直接将变量传递过去而不是变量的地址传递过去不是非法的吗

vb中copymemory函数的使用挺耐人寻味的。copymemory的使用说明资料书上就一句“该函数用于将一块内存的数据从一个位置复制到另一个位置”。其参数数据类型destination as any,source as any。尽管是any型可理解成任一类型但是我看很多地方都说参数是指针类型的。因此起初我很不解,既然是指针型的参数我们往往直接将变量传递过去而不是变量的地址传递过去不是非法的吗?其实copymemory使用的灵活度是很大的,还是开始给出的定义最有说明性,将一块内存的数据从一个位置复制到另一个位置就是最好的解释。看下面几段程序有助于我们更好理解。
程序一:Private Declare Sub CopyMemory Lib “kernel32” Alias “RtlMoveMemory” (Destination As Any, Source As Any, ByVal Length As Long)
Private Sub Command1_Click()

Dim str1 As String
Dim str2 As String
str2 = “hello world”
CopyMemory str1, str2, 4
Text1.Text = str1
End Sub
这是候调试结果text1显示的内容完全就是str2复制过去的内容,即hello world。






如果改一句“copymemory str1,strptr(str2),4″,这时候传递的是str2的指针,那么text1显示的结果就是h。
怎么样去理解?strptr(str2)得到的是一个指针毋庸置疑,即使函数参数是any型的因此该参数是合法的没问题,那么传递给str1,str1开始申明的是一个string型的变量,而不是一个string型的指针变量,因此传递参数的类型不一致为什么也是合法的,而且最终得到一个结果h。于是我上网找了vb中关于指针变量的定义,大家都说vb没有直接定义指针的。因此我想是不是str1放在copymemory中做参数接受指针变量的时候已经被强制转变成指针型变量了。
程序二:Private Declare Sub CopyMemory Lib “kernel32” Alias “RtlMoveMemory” (Destination As Any, Source As Any, ByVal Length As Long)
Private Sub Form_Load()

Dim i As Long
Dim k As Long
k = 5
i = VarPtr(k)
Debug.Print i




Debug.Print VarPtr(i)

CopyMemory i, 40000, 4
Debug.Print VarPtr(i)
Debug.Print i
Debug.Print k
Debug.Print “*”
End Sub





调试结果:

 

 
  40000
  5
*



说明变量i,k的地址是,。这一句:CopyMemory i, 40000, 4就是直接给变量i赋值40000而不是把地址值40000赋过去将变量i的地址改变成40000。如果想通过指针的方式修改k的初始值的话。
可以用下面这几句:
Dim i As Long

Dim k As Long
k = 5
i = VarPtr(k)
CopyMemory ByVal i, 40000, 4
Debug.Print k
Debug.Print “*”





这时候就会发现k的值已经被修改成40000了。怎么样去理解?i 的值由i=varptr(k)一句变成k的地址值了,这时候用byval i表示的是该地址指向的内容,修改成40000后也就是k值被修改了。
VB中由于没有明确的指针定义,涉及到指针操作是通过API函数copymemory来进行,相对于C等语言来说形式上没有那么严格要求,因此外形上看很不明晰。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221957.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:53
下一篇 2026年3月17日 下午4:54


相关推荐

  • C JSON字符串转JSON对象

    C JSON字符串转JSON对象往往会有这么一种情景 有一个自定义的 json 或者 json 数组的字符串 希望转换成对应的对象 由于程序对于自定义的 JSON 格式并不清楚 所以直接 ToObject 或者 ToList 均会失败 这时我们要做的就是让程序知道我们自定义的 json 到底是什么样的 如下 数据库中某个字段内容如下 NeedToJson 用于接收该字段值 ProjectName 锅炉整体是否有明显的

    2026年3月19日
    2
  • Android自定义控件之滑动解锁

    Android自定义控件之滑动解锁代码参考地址https://github.com/liuzhiyuan0932/SlideUnLock代码效果图>自定义滑动解锁的控件继承自ViewpublicclassSlideUnlockViewextendsView自定义SlideUnLockView的属性在values文件夹中定义属性

    2022年6月24日
    27
  • tkmapper mybatis plus 集成_gitea docker

    tkmapper mybatis plus 集成_gitea docker———————————————————————————————————————————-一、设置TkMapper单独放在一个包:这个包只有TkMapper一个文件importtk.mybatis.mapper.common.M…

    2022年10月7日
    6
  • 1、Python 日期时间格式化输出

    1、Python 日期时间格式化输出

    2021年10月22日
    49
  • 从@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor开始了解Lombok插件

    从@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor开始了解Lombok插件接触 Lombok NoArgsConstr RequiredArgs AllArgsContr 是 Lombok 插件三种生成不同构造方法的注解 来完成项目中不同构造方法的需求 NoArgsConstr 生成一个无参数的构造方法 AllArgsContr 会生成一个包含所有变量 RequiredArgs

    2026年3月19日
    2
  • 字典树详解「建议收藏」

    字典树详解「建议收藏」字典树字典树(又叫单词查找树、TrieTree),是一种树形结构,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串)。主要思想是利用字符串的公共前缀来节约存储空间。很好地利用了串的公共前缀,节约了存储空间。字典树主要包含两种操作,插入和查找 是一种哈希树的变种,常用于,统计,排序,保存大量字符串(但不仅限于字符串),主要实现方法是利用串的公共前缀来减少查询时间,减少了不必要的比较,不仅…

    2025年9月27日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号