首页 > 编程知识 正文

python reduce函数,可用于字符串复制的函数

时间:2023-05-04 12:57:29 阅读:115628 作者:4351

CopyMemory函数

(1) VatPtr/ StrPtr/ ObjPtr

VarPtr :返回变量地址

StrPtr :返回真正的unicode字符串缓冲区的地址

ObjPtr :返回任意对象变量引用的地址

它们是VB愿意提供给我们的好宝物,它们是VBA函数库中的隐藏函数。 为什么要隐瞒? 因为VB开发团队不鼓励我使用指针哦。

VarPtr返回变量所在位置的内存地址。 也可以说返回了指向变量内存位置的指针。 这是我们在VB上处理指针最重要的武器之一。

privatedeclarefunctionobjptrlib ' msvbvm60 ' alias ' varptr ' (varas object ) As Long

privatedeclarefunctionvarptrlib ' msvbvm60 ' (varas any ) As Long

没有StrPtr,是因为VB对字符串处理方式有点不同,这方面的问题太多,

(2) ByVal和ByRef

ByVal传递的参数值是、

ByRef传递的参数的地址。 无需区分指针传递/地址传递/引用传递之间的差异。 在VB中,它们基本上是一个事物的三种不同的说法,VB文档中也有混合使用这些术语的地方。 (但是,在c中必须区分指针和引用)

在对内向菠萝的CopyMemory调用中,清楚ByVal放在哪里,不放在哪里,准确理解传递价格和传递地址(指针)之间的区别是在VB中正确使用指针的基础。

(3)AddressOf

用于获取指向VB函数条目地址的指针,但该指针只能传递给API,以便API可以回调VB函数。

(4)CopyMemory函数

privatedeclaresubcopymemorylib ' kernel32 ' alias ' rtlmovememory ' (pdestasany、pSourceAsAny、ByValbyteLenAsLong )的功能是psouus

其中,源地址和目标地址都声明为Any类型。

以下内容说明复制内存了解不同格式的参数。 (1)如果将变量传递给pSource,则源地址为变量所在的地址。 )2)如果以ByVal格式将变量传递给pSource,则源地址为变量值

例如:

Dim k As Long

k=5

'从保存有常数40000的临时变量中复制4字节,保存在变量k所在的存储器中。

copymemorybyvalvarptr(k )、40000、4 ' [ byval varptr ] k )将k的地址本身作为值传递给函数]

复制内存k、40000和4'k传递函数的默认方法是ByRef,因此也可以这样写

版权所有byvalvarptr (k ),byval 40000,4

“意思是从地址40000向有变量k的存储器复制4字节。 结果错误,因为地址40000所在的内存未知或无法访问

复制内存验证器(k ),40000,4,4

意思是。 从保存常数40000的临时变量复制4字节。 因为默认值为ByRef,所以varptr(k )是k的地址,是临时变量。 得到这个临时变量的地址并传递给函数。 该临时变量的内存地址没有任何意义,k的值不变。

(5)字符串变量CopyMemory

字符串变量的值是字符串缓冲区的地址,也就是指向StrPtr(Str1)的指针。

如果以ByVal格式将字符串变量传递给pSource,则源地址是字符串变量的值,即字符串缓冲区的地址。 下表总结了传递给CopyMemory的常见参数的格式。 注: (1)根据http://www.Sina.com/bytelen实际规定的字节数多少,可能会有所不同,但这里只是粗略估计。 )2)在加亮的两行中,VB会自动对字符串参数进行UA转换,所以实际的复制内存操作是对通过String1转换得到的ANSI字符串_tmp1进行的。 )3)取到的内容列显示了可用于检索有效数据byteLen参数的数字范围。 简单地说,如果pSource的参数是字符串型,则字节len的字节数是与String1对应的ANSI字符串的长度。 理解这一点也很简单,只要记住CopyMemory此时实际上在操作ANSI字符串就可以了。 如果不发生字符串转换,则如正反第4行所示,复制String1的LebB长度。 这也可以理解。 如果不发生转换,CopyMemory实际上是直接复制Unicode字符串的内容吧。 subswapptr(saasstring,sB As String ) Dim lTmp As Long CopyMemory lTmp,byvalvarptr ) sa ),4copymemorybyvalvarptr ) sa,byvary 4copymemorybyvalvarptr )4copymemorybyvalvarptr(sb )、lTmp、4endsubswapstrptr2) sB As String、sB As String ) dim ltmp as long PSA as long psbaslongptmp=varptr (ltmp ) :psA=varptr ) sa ) :PSB=varptr ) sb )复制内存ptmp、PSA、4复制内存PP

'交换两个字符串的最快方法subswapstrptr3(saasstring,sB As String ) Dim lTmp As Long Dim pTmp As Long,psA As Long, PSBaslongptmp=strptr(sa ) :PSA=varptr ) sa ) :PSB=varptr ) sb ) CopyMemory ByVal psA,ByVal psB,4 copymemorymemorybyvyvyval

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。