|
8#
楼主 |
发表于 2015-6-13 17:50:05
|
只看该作者
本帖最后由 ganlinlao 于 2015-6-30 12:43 编辑
如果有点指针使用概念,指针并不复杂。
例子代码在excel的VBA中测试通过:
Sub testPtrLng()
Dim i As Long, p As VBAX.IntPtr '声明p为指针
p = VarPtr(i) '在使用指针之前必须初始化,把p指向它指向的地址,即变量i的首地址
i = 100
Debug.Print i
PtrLng(p) = 200 '因为VB中没有@用来表示取址,或*用来表示取值。所以这里ptrLng()相当*取值符
MsgBox i '指针都是间接引用,变量名都是直接引用,看起来似乎是绕一个弯,但你想想c就知道,为什么c很猛
End Sub
*********************************************************************************************************
三、千金买美人,何处卖青春----string的故事
1、string的替换函数的区别:
Sub testReplace()
Dim str As String, pStr As VBAX.IntPtr, pstr1 As VBAX.IntPtr
str = "我是中国人"
pStr = StrPtr(str)
Debug.Print str
Debug.Print pStr
str = Replace(str, "是", "爱")
pstr1 = StrPtr(str)
Debug.Print str
Debug.Print pstr1
End Sub
#############
Sub testMid() ‘mid语句
Dim str As String, pStr As VBAX.IntPtr, pstr1 As VBAX.IntPtr
str = "我是中国人"
pStr = StrPtr(str)
Debug.Print str
Debug.Print pStr
Mid(str, 2, 1) = "爱"
pstr1 = StrPtr(str)
Debug.Print str
Debug.Print "Mid语句的str内存地址没有发生变化:" & vbTab & pstr1
End Sub
##########
Sub testMidFunction() 'mid函数
Dim str As String, pStr As VBAX.IntPtr, pstr1 As VBAX.IntPtr
str = "我是中国人"
pStr = StrPtr(str)
Debug.Print str
Debug.Print pStr
str = Mid(str, 1)
pstr1 = StrPtr(str)
Debug.Print str
Debug.Print "mid函数的str内存地址发生变化:" & vbTab & pstr1
End Sub
其实我们很容易理解vba中的所有string的处理函数,都会有一个返回值,而这个返回值是一个全新的ret字符串。
真正让我吃惊的是mid语句,str内存地址没有发生变化,说明str字符串在内部是可直接读写,而无须重新生存一个完全拷贝的ret字符串。
说明mid语句性能比Replace要高。
但事情没这么简单,接下来,就是我解决不了的疑惑:
Sub testpStr()
Dim str As String, pStr As VBAX.IntPtr, pstr1 As VBAX.IntPtr
str = "我是中国人"
pStr = StrPtr(str)
Debug.Print str
Debug.Print pStr
PutMem2 pStr + 2, "爱" '这里即使是用putMem1把unicode当成一个字符,也同样是显示乱码
pstr1 = StrPtr(str)
Debug.Print "指针读写会显示乱码:" & str
Debug.Print "str内存地址没有变化:" & pstr1
End Sub
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|