两者效果并不一样。在理解之前,你需要知道VB对于字符串的处理方式。string1变量,本质上是一个指针,指向实际的字符串开头位置,这个位置再往前的4个字节是一个long,表示字符串的长度。
第一种,ByVal String2,实际效果是把string2的内容直接传递给copymemory(严格的说不是,VB有别的小动作),CopyMemory 的执行效果就是把string1指向的字符串复制5个字符到string2指向的字符串,这种写法在VB里是最正确的。
第二种,如果用第二种copymemory的声明,效果就是CopyMemory byval VarPtr(String2),byval VarPtr(String1), 4。这样表面上能复制,实际情况是,VarPtr(String2)获得string2自身的地址而不是string2保存的内容也就是那个指针,然后传给函数,也就是把string1的值强制复制给了string2,执行完之后,string1、2指向同一个位置(因为他们的值一样)。只要别改变string1的字符串内容,以后string2一直等于string1 。但如果你写了这句 string1=“asdf”,每次给字符串赋值时VB都要重新分配内存,这样,string1是个正常的变量,但string2还是指向老地方(那里已经不属于string1了),所以Print string2显示的一般是乱码。
另外,每次运行这类内存相关的函数前要保存,一个粗心就导致VB崩了,重打字麻烦O(∩_∩)O~
vb.net copymemory 用法
CopyMemory()函数功能描述:将一块内存的数据从一个位置复制到另一个位置。
函数原型
VOID CopyMemory(PVOID Destination,CONST VOID *Source,SIZE_T Length)
参数
Destination要复制内存块的目的地址。
Source要复制内存块的源地址。
Length指定要复制内存块的大小,单位为字节
返回值该函数为VOID型,没有返回值。
备注如果目的块与源块有交叠,结果是不可预料的,使用MoveMemory可以解决这个问题。
注意一点CopyMemory和MoveMemory不过是RtlMoveMemory的一个别名而已
示例代码段
char szname[50]="阵雨"
char szfriend[]="polelf,oo"
CopyMemory(szname+4,szfriend,10)
OutputDebugString(szname)//输出结果为"阵雨polelf,oo"
vb6的声明:
Private Declare Sub CopyMemory Lib "kernel32" Alias"RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length AsLong)
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
参数
Destination 要复制内存块的目的地址。
Source 要复制内存块的源地址。
Length 指定要复制内存块的大小,单位为字节
返回值 该函数为VOID型,没有返回值。
以上就是关于VB中CopyMemory用法全部的内容,如果了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!