体验ByVal和ByRef
Dim k As Long
版权所有(k ),40000,4,4
等于k=40000; 从常数40000 (保存默认ByRef )的临时变量的位置)地址)复制4字节到保存变量k的内存。
版权所有byvalvarptr (k ),byval 40000,4
k=(40000的地址); 从地址40000复制4字节到变量k所在的内存。 由于无法访问具有地址40000的内存,操作系统将通知访问权限迁移内存错误
复制内存验证器(k ),40000,4,4
从保存有常数40000的临时变量的位置(地址)复制4字节(即40000 ),然后前往保存有变量k的存储器地址值的临时变量的位置。 这无法避免内存越权访问错误,但k的值保持不变。
“看看我们的东西复制到哪里了
次测试复制内存(
Dim i As Long,k As Long
k=5
I=varptr(k )
复制内存I,40000,4 ' note 4:
Debug.Print k
Debug.Print i
I=varptr(k )
复制内存字节I,40000,4 ' note 5:
Debug.Print k
最终辅
程序输出:
5
40000
40000
NOTE4使用默认的ByVal,并传递指向I地址(即I )的指针,因此常量40000被复制到变量I,I的值为40000,但k的值保持不变。 但是,在NOTE4之前,有一个I=varptr(k ),本来打算把I本身作为一个指针来使用。 此时,我们必须像NOTE5那样在ByVal中传递指针I,I是指向变量k的指针,所以最后常数40000被复制到变量k中
'使用更安全的复制内存,明确地使用指针!
privatedeclaresubcopymemorylib ' kernel32 ' alias ' rtlmovememory ' (byvaldestinationaslong,ByVal Source As Long,byvallength
subswapstrptr2(saasstring,sB As String ) )。
Dim lTmp As Long
Dim pTmp As Long,psA As Long,psB As Long
ptmp=varptr(ltmp ) : PSA=varptr (sa ) : PSB=varptr (sb ) )
复制内存ptmp,psA,4
复制内存PSA,psB,4
复制内存PSB,pTmp,4
最终辅
请注意,上述复制内存声明使用的是ByVal和long,需要传递32位地址值。 如果将另一个类型传递给此API,编译器将报告错误。 例如,现在使用以下语句:
转载于:https://www.cn blogs.com/whchensir/p/4135560.html