wchar_t,
TCHAR等类型
可以参考
delphi中的string类型是一类比较特殊的字符串类型。
Delphi中String分为Short
String和Long
String。
32位版本delphi中默认都使用Long
String做为String。Long
String的容量只受有限内存的限制,在32位系统中最多可有4G
并加入了对pchar的内建支持
具体实现是一块动态分配的内存块,内存块的前两个dword
保存着此字符串的长度和引用计数器等等信息,
因为是用一个dword保存长度,因此字符串长度可以非常大
呵呵,具体多大其实根本没有意义,反正用不完了
:)
然后字符串的末尾以#0结束,以兼容window用的sz字符串类型
所谓pchar(str)转换,其实只是取字符串的头指针罢了
(注意这里的头指针直接指向字符串数据,不包括字符串数据头
那两个dword)
值得注意的是,delphi里面提供了一种非常强大的copy
on
write机制
详细一点说就是你如果把一个字符串直接复制到另外一个字符串类型
用:=复制,则delphi只是在内存中维护一份字符串数据,相当于指针赋值
而把此字符串的引用计数器加一,两个字符串变量都指向这个字符串数据
但是一旦你写了其中一个字符串,delphi则自动将此字符串在内存中
复制一遍,把你的修改反映到新的字符串数据中,这样两个变量就自动
指向不同的字符串数据,这些支持都是在底层自动实现的,如果你只是
使用标准的string类型,完全可以不关心,delphi全部自己搞定
但是麻烦的是,如果你用pchar类型,或者试图把字符串传递个其他语言
编写的模块,就必须考虑上述情况,因为一个pchar类型,其实只是一个
指向字符数组的指针,是不存在string类型中负偏移的那些数据的
虽然delphi内建提供了string与pchar的转换,但是如果跨语言
或者调用api时,某些情况下必须予以考虑……
所以delphi的string是强大的,不用搞那么麻烦的指针,但是如果跟VC交互,那你不得不用pchar指针类型跟VC实现交互。该死的VC的指针。。。。。。
{转换 tbytes 到 integer}procedure tform1.button1click(sender: tobject)
var
bs: tbytes{tbytes 就是 byte 的动态数组}
i: integer
begin
{它应该和 integer 一样大小才适合转换}
setlength(bs, 4)
bs[0] := $10
bs[1] := $27
bs[2] := 0
bs[3] := 0
{因为 tbytes 是动态数组, 所以它的变量 bs 是个指针所以先转换到 pinteger} i := pinteger(bs)^
showmessage(inttostr(i)){10000}
end
{从 bytes 静态数组到 integer 的转换会方便些}
procedure tform1.button2click(sender: tobject)
var
bs: array[0..3] of byte
i: integer
begin
bs[0] := $10
bs[1] := $27
bs[2] := 0
bs[3] := 0
i := integer(bs)
showmessage(inttostr(i)){10000}
end
{转换到自定义的结构}
procedure tform1.button3click(sender: tobject)
type
tdata = packed record
a: integer
b: word
end
var
bs: array[0..5] of byte{这个数组应该和结构大小一直}
data: tdata
begin
fillchar(bs, length(bs), 0)
bs[0] := $10
bs[1] := $27
data := tdata(bs)
showmessage(inttostr(data.a)){10000}
end
{转换给自定义结构的一个成员}
procedure tform1.button4click(sender: tobject)
type
tdata = packed record
a: integer
b: word
end
var
bs: array[0..3] of byte
data: tdata
begin
fillchar(bs, length(bs), 0)
bs[0] := $10
bs[1] := $27
data.a := integer(bs)
showmessage(inttostr(data.a)){10000}
end
对象的引用其实就是个地址,指针也是个地址所以TObject(ptr)是告诉编译器这个ptr指针其实是个TObject对象,然后把对象的引用放到FColInfo.Objects这个数组中的最后一个。
这里面都是引用传递,没有生成新的对象,所以不能成为把一个对象赋给另一个对象,只能说是把一个对象的引用放到一个数组中去了
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)