- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Delphi字符串类型浅析(DOC可编).doc
Delphi 字符串类型浅析 收藏
参考资料《Delphi 5开发人员指南》“第2章Object Pascal语言”
《PASCAL精要》“第7章 字符串操作”
“Delphi中String类型和Char类型的比较”
“Object Pascal中String类型的内幕探讨”
基本知识字符串类型
?AnsiString这是Pascal缺省的字符串类型,它由AnsiChar字符组成,其长度没有限制,同时与null结束的字符串相兼容。
?ShortString保留该类型是为了向后兼容Delphi1.0,它的长度限制在255个字符内。
?WideString功能上类似于AnsiString,但它是由WideChar字符(UniCode字符集)组成的。引入这种类型,主要是为了支持OLE编程。
?PChar指向null结束的Char字符串的指针,类似于C的char*或lpstr类型。
?PAnsiChar指向null结束的AnsiChar字符串的指针。
?PWideChar指向null结束的WideChar字符串的指针。
字符类型
?AnsiChar,以 8 位表示 (共有 256 个不同的符号)。
?WideChar,以 16 位表示 (共有 64,000 个不同的符号)。
String类型
注意:以下是指Delphi2007以前的编译器(包括Delphi2007)。
1、缺省情况下,如果用如下的代码来定义字符串,编译器认为是AnsiString字符串:
var
S:string;//编译器认为S的类型是AnsiString
2、编译开关$H
“$H编译开关”的值用来决定当变量声明为string时,它是被当作AnsiString类型还是被当作ShortString类型。当“$H”值为负时,string变量是ShortString类型;当“$H”值为正时(缺省情况),string变量是AnsiString类型。下面的代码演示了这种情况:
var
{$H-}
S1:string;//S1是ShortString类型
{$H+}
S2:string;//S2是AnsiString类型
使用$H规则的一个例外是,如果在定义时特地指定了长度(最大在255个字符内),那么总是ShortString。
var
S:string[63];//63个字符的ShortString字符串
Char类型
1、Delphi2007以前的编译器(包括Delphi2007)缺省情况下认为Char是AnsiChar类型,PChar是PAnsiChar类型。
2、Delphi2009的编译器缺省情况下认为Char是WideChar类型,PChar是PWideChar类型。
请注意,没有任何方法可变更这个新的编译器预设设定。对于字符串类型而言,会以固定的硬式编码方式将 Char 类型对应到特定的数据类型。
AnsiString类型
1、AnsiString是生存期自管理类型。
2、AnsiString字符串总是以null字符结束的,这使得AnsiString字符串能与Win32API中的字符串兼容。
3、AnsiString类型是一个指向在堆栈中的字符串结构的指针。
可以使用Sizeof去读取AnsiString类型的大小,不论字符串的实际长度是多少,Sizeof(AString)永远是4。
4、AnsiString字符串在内存中分配的情况
注意:
在Delphi2.0以后版本中,不能再通过字符串的第0个元素来设置或得到字符串的长度,只能通过Length()函数来得到字符串的长度,通过SetLength()过程来设置字符串的长度。
Borland并不保证String的内存结构在以后的Delphi版本中会保持不变。
(1)、Delphi5内存结构如下:
(2)、Delphi7内存结构如下:
AnsiString指向一块内存起始偏移8字节处,前面8字节依次为引用计数和长度计数两个整数。
(3)、Delphi2009内存结构如下:
-12
-10
-8
-4
最后一位
字码页
字符大小
引用计数
字串长度
字串内容
0
除了字串长度及引用计数外,新的AnsiString格式包括字符大小及字码页。字符大小可用来区分 AnsiString 及UnicodeString,而字码页特别适用于 AnsiString 类型 (可用于 Delphi 2009),UnicodeString 类型的字码页则固定为 1200,字码包括UTF-8、GBK等,例如“$03A8就是936,查MSDN 936 - gb2312”。
5、AnsiString字符串的引用计数机制。
(1)、AnsiString字符串基于引用计数机制,通过引用计
文档评论(0)