Delphi 字符串类型浅析
Delphi的String内存结构(够清楚)good

Delphi的String内存结构(够清楚)good[delphi]1. var2. s: AnsiString;3. begin4. s := '1234567890';5. showmessage(s);6. end;7.变量s的内存结构为(⼀共12个辅助字节,以前是8个字节)(字符串编码)A8 03 (字符宽度)01 00 (引⽤计数)FF FF FF FF (字符串长度)0A 00 00 00 (实际内容)31 32 33 34 35 36 37 38 39 30 (结束符)0001~02 字节是代码页,如上⾯的0x03A8为⼗进制的936,表⽰简体中⽂GBK03~04 字节表⽰每个字符所占的字节数(ANSI为1,Unicode为2)05~08 字节是该字符串的引⽤计数09~12 字节是该字符串的字符个数13~?? 字节就是字符串实际的内容了最后⼀个字节是00,字符串的结束符对于string变量类型s,它实际上是⼀个指针,指向字符串⾸个字符的地址,也就是第13个字节这⾥需要注意的是,在Delphi 2009以前的版本中是没有描述代码页的4字节的(代码页+字符宽度),⽽是直接从第05字节开始(引⽤计数)。
上⾯的字符串引⽤计数为什么会是0xFFFFFFFF呢?因为该字符串是常量,对于常量字符串,引⽤计数总是-1若有N处相同的字符串常量时,就有N份的拷贝,这样就造成了空间上的浪费,Delphi并未作出优化下⾯的代码就可以说明问题,两次显⽰的字符串内存地址不同。
[delphi]1. procedure Foo();2. var3. s: AnsiString;4. begin5. s := '1234567890';6. ShowMessage(IntToHex(Integer(@s[1]), 8));7. end;8.9. procedure TForm1.Button1Click(Sender: TObject);10. var11. s: AnsiString;12. begin13. s := '1234567890';14. ShowMessage(IntToHex(Integer(@s[1]), 8));15. Foo;16. end;接着看看下⾯的代码[delphi]1. var2. s: AnsiString;3. begin4. s := Caption;5. ShowMessage(IntToHex(Integer(@s[1]), 8));6. end;由于没有使⽤常量字符串,所以引⽤计数不再是-1(代码页)A8 03 (字符宽度)01 00 (引⽤计数是1)01 00 00 00 (字符串长度)05 00 00 00 (字符内容)46 6F 72 6D 31 (结束符)00在知道了string的内存结构后,我们就可以通过代码来观测引⽤计数的值了[delphi]1. var2. s, s2: AnsiString;3. p: ^Integer;4. begin5. s := Caption;6. p := Pointer(@s[1]); // 应该是得到s[1]的地址,即第⼀个字符的地址7. Dec(p, 2); // 前移2个单位(8个字节,因为每个^integer类型的数据长度是4)8. ShowMessage(IntToStr(p^)); // 1,引⽤计数为19.10. s2 := s; // 引⽤计数+1了11. ShowMessage(IntToStr(p^)); // 2,引⽤计数为212. end;。
Delphi类型转换

Delphi类型转换。
Chr 将一个有序数据转换为一个ANSI字符Ord 将一个有序类型值转换为它的序号Round 转换一个实型值为四舍五入后的整型值Trunc 转换一个实型值为小数截断后的整型值Int 返回浮点数的整数部分IntToStr 将数值转换为字符串IntToHex 将数值转换为十六进制数字符串StrToInt 将字符串转换为一个整型数,如字符串不是一个合法的整型将引发异常StrToIntDef 将字符串转换为一个整数,如字符串不合法返回一个缺省值Val 将字符串转换为一个数字(传统Turbo Pascal例程用于向后兼容)Str 将数字转换为格式化字符串(传统Turbo Pascal例程用于向后兼容)StrPas 将零终止字符串转换为Pascal类型字符串,在32位Delphi中这种类型转换是自动进行的StrPCopy 拷贝一个Pascal类型字符串到一个零终止字符串, 在32位Delphi中这种类型转换是自动进行的StrPLCopy 拷贝Pascal类型字符串的一部分到一个零终止字符串Delphi 7.0常用函数由一句或多句代码组成,可以实现某个特定的功能。
使用函数可以使代码更加易读、易懂,加快编程速度及减少重复代码。
过程与函数类似,过程与函数最重要的区别在于,过程没有返回值,而函数能有返回值。
在Delphi 7.0中,已为我们定义好了非常多的函数,大致分类有6种:数据类型转换函数、字符串、数组操作函数、文件、磁盘操作函数、内存、指针操作函数、数学运算函数、日期函数。
在Delphi中调用函数,一般情况下可以直接使用函数即可,但由于有一些函数未包含在Uses中列出的单元中(默认单元有Windows,Messages,SysUtils,Variants,Classes,Graphics, Controls,Forms,Dialogs,所以需要我们手动添加单元。
比如,MidStr函数就未包含在这些单元中,MidStr所属单元在StrUtils中,因此我们将StrUtils添加Uses中即可。
delphi数据类型

字节 4 4 1 2 4 8 1 2 4
备注 有符号32位 无符号32位 有符号8位 有符号16位 有符号32位 有符号64位 无符号8位 无符号16位 无符号32位 8位 16位
1
1 2 4
5.0×10-324 .. 1.7×10308 2.9×10-39 .. 1.7×1038 1.5×10-45 .. 3.4×1038 5.0×10-324 .. 1.7×10308 3.6×10-4951 .. 1.1×104932 63 63 -2 + 1 .. 2 - 1 -922337203685477.5808 .. 9.22337E+14 255个字符 大约 231 个字符 大约 2 String
范围 -2147483648 .. 2147483647 0 .. 4294967295 -128 .. 127 -32768 .. 32767 -2147483648 .. 2147483647 -263 .. 263 0 .. 255 0 .. 65535 0 .. 4294967295 ANSI字符集 Unicode字符集 False < True Ord(False) = 0 Ord(True) = 1 Succ(False) = True Pred(True) = False False <> True Ord(False) = 0 Ord(True) <> 0 Succ(False) = True Pred(False) = True
个字符
字符串 其他 String[0..255] PChar PAnsiString PWideString 最多256个元素[0..255]
集合 数组 结构类型 记录 文件 类 类引用 接口 无类型指 针 静态数 动态数
delphi ansistring指针

delphi ansistring指针在Delphi中,`AnsiString`类型是一种动态字符串类型,可以用于存储ANSI 字符集的字符串。
指针则是一种特殊的数据类型,它存储了一个内存地址,可以用来访问和操作内存中的数据。
如果你想在Delphi中使用`AnsiString`类型的指针,可以使用`PAnsiChar`类型。
`PAnsiChar`是一个指向`AnsiChar`的指针类型,可以用于处理`AnsiString`。
以下是一个示例,展示如何使用`PAnsiChar`指针来处理`AnsiString`类型的字符串:```delphivarstr: AnsiString;ptr: PAnsiChar;beginstr := 'Hello, Delphi!';// 将指针指向字符串的首字符ptr := PAnsiChar(str);// 使用指针访问字符串中的字符while ptr^ <> #0 dobegin// 输出当前指针指向的字符WriteLn(ptr^);// 指针向前移动一个字符位置Inc(ptr);end;end;```在上述示例中,我们首先声明了一个`AnsiString`类型的字符串`str`,并将其初始化为`'Hello, Delphi!'`。
然后,我们声明了一个`PAnsiChar`类型的指针变量`ptr`,并将其指向`str`的首字符。
接下来,在`while`循环中,我们使用指针`ptr^`访问当前指针指向的字符,并输出该字符。
然后,通过`Inc(ptr)`将指针向前移动一个字符位置,以便继续处理下一个字符。
循环将在遇到字符串的终止字符`#0`时结束。
通过使用`PAnsiChar`指针,我们可以对`AnsiString`类型的字符串进行逐字符的操作和访问。
请注意,在处理指针时要小心避免指针越界和内存泄漏等问题。
Delphi笔记

Delphi笔记Delphi笔记-ObjectPascal的相关内容Delphi学习笔记2007-12-08 21:15:51 阅读121 评论0 字号:大中小订阅Pascal有3种字符串类型:1.ShortString该类型的字符串的最大长度为255个字符。
所占的内存中的第一个字节地址中存放字符串的长度信息。
每个字符占一个字节的空间。
它所占的内存是静态分配的。
2.AnsiString是一种动态分配内存的字符串类型,最大长度为2的31次幂个字符,占2GB的内存空间。
它的变量是一个占4B内存的指针,指向动态内存。
每个字符占一个字节。
3.WideString也是一种动态分配内存的字符串类型,最大长度比AnsiString小一个字符。
它的效率比AnsiString差。
每个字符占两个字节。
内存分配和释放函数:AllocMem() FreeMem()GlobalAlloc() GlobalFree()GetMem() FreeMem()New() Dispose()StrAlloc() StrDsipose()StrNew() StrDispose()VirtualAlloc() VirtualFree()SetLength()函数和过程的重载要用关键字overload,类的函数和过程的覆盖要用override。
它们的区别是:重载的多个函数具有相同的函数名,不同的参数列表;覆盖用在父类与子类之间,子类的同名函数覆盖父类的同名虚函数或动态函数。
数据类型表:8位有符号整数:ShortInt8位无符号整数:Byte16位有符号整数:SmallInt16位无符号整数:Word32位有符号整数:Integer,LongInt32位无符号整数:LongWord,Cardinal64位有符号整数:Int644字节浮点数:Single6字节浮点数:Real488字节浮点数:Double10字节浮点数:Extended64位货币值:currency8字节日期/时间值:TDateTime16字节variant:Variant,OleVariant,TVarData1字节字符:Char2字节字符:WideChar固定长度(最大为255个字符)的字符串:ShortString动态字符串:AnsiString, WideString以NULL(即以#0)结束的字符串:PChar , PWideChar1字节布尔值:Boolean,ByteBool2字节布尔值:WordBool4字节布尔值:BOOL,LongBool当第一次声明了一个AnsiString变量时,它是没有长度的,也没有分配内存空间,可以通过给它赋值或调用SetLength()函数来给它分配内存空间。
第2章 Delphi语法基础资料

第2章Delphi语法基础2.1标识符与保留字2.1.1 标识符标识符是Object Pascal语言中各种成分的名称,这些成分包括变量(Var)、常量(Const)、类型(Type)、过程(Procedure)、函数(Function)、方法(Method)、单元(Unit)等。
标识符可以分为三类:标准标识符、自定义标识符和限定标识符。
1.标准标识符▪(1)标准常量,如False、True等;▪(2)标准类型,如Boolean、Char等;▪(3)标准函数,如Sin、Cos、Abs等;▪(4)标准过程,如Dispose、Get、New、Pack、Put等;▪(5)标准文件,如Input、Output等。
2.自定义标识符:自定义标识符可以由任意长的一个不带空格的字符串组成,包括字母A~Z 、a~z 、数字0~9 和下划线“_”等。
定义标识符需要遵循以下规则:▪(1)标识符不区分大小写;▪(2)标识符只能以字母或下划线开头,不能以数字开头;▪(3)标识符可任意长度,但只有前225个字符有效;▪(4)标识符中间不允许有空格;(5)不允许使用Object Pascal语言的保留字作为标识符。
3.限定标识符在Delphi程序中可引用多个单元,而各个单元中全局变量、函数、过程等可能会同名,在引用时需用限定标识符来区分它们:VarY:real;Y:=System.cos(pi);其中System称为限定符,而System.cos称为限定标识符。
2.1.2 保留字保留字由系统规定具有特定意义,不能被重新定义或作他用,定义了65个保留字。
注意:1.单词at和on具有特殊含义,不要与它们同名。
2.保留字和Object Pascal一样不区分大小写。
Object Pascal的保留字and array as asm begin caseclass const constructor destructordispinterface divdo downto else end except exports file finalization finally for function gotoif implementation in inheritedinitializationinlineinterface is label library mod nil not object of or out packed procedure program property raise record repeatresourcestringset shl shr string then threadvar to try type unit until uses var while with xor2.1.3 指令符指令字只在特殊的程序位置、或当上下文关联时有意义的程序区段有自己特殊的意义,而在其他场合,用户可对其重新定义,即可将其定义为标识符,Object Pascal不会指示出错,当用户重新定义这些指令字后,在作用域内它们就失去了原来的意义了。
Delphi中的基本数据类型
e、子界类型:
定义:type子界类型标识符=下界..下界
如:type SubInt=1..3 0;表示1~30的整数
type SubChar='a'..'z';表示字符
※注:1、以上四种类型称为有序类型,即除第一个数为都有先行数、除最后一个数外都有后继数。在这里
h、时间、日期类型:TDateTime-实际是浮点类型的别称
具体:
ByteBool<8位>,WordBool<16位>,LongBool<32位>
不同的布尔类型主要用于鱼其它编程语言及不同windows系统兼容。
d、枚举类型:
定义:type枚举类型标识符=(key1[=val1],.。。。,keyn[=valn]):n<=255
如果给某些key指定了值,则未指定值的key是前一个key值加1;
Extended<10字节>,Comp<8字节>,Currency<8字节>
g、字符串类型:(通用类型:String-与AnsiString等同)
具体:
ShortString:最多存放255个字符,第一个自己存放字符个数,不以NULL结尾
AnsiString:存放Ansi字符,以NULL结尾
WideString:存放Unicode字符,以NULL结尾
无符号:Byte<8位>,Word<16位>,LongiWord<32位>
b、字符类型:(通用类型<8位>:Char-与AnsiChar等同)
具体:
AnsiChar<8位>:放Unicode字符
delphi中的string和char?数组的转化理解
delphi中的string和char?数组的转化理解最近发现,程序的设计在细节的地方很磨人。
今天就记录一下关于在和C程序的DLL通信过程中,字符串变量和字符数组的转化传递问题。
首先是了解一下各自的结构:
其次是数组:array[] of char;
数组就是很简单的类型了。
从0开始存放单个字符。
在其转化过程中,
以#0结束的字符数组可以直接当string使用。
StrPCopy(Arr,Str);用于把string变为字符数组
Move(str[1],arr[0],length(str))用于把string变为字符数组
StrPas(Arr[0])用于把数组变为string
pchar是指向字符串及字符数组的指针,可以如下使用
p:=pchar(str);就能得到string的首地址
p:=@arr[0];就能得到arr的首地址
刚理解这些。
先记下。
不对再改。
:)。
Delphi代码优化——字符串篇
Delphi代码优化——字符串篇
杜嵩
【期刊名称】《程序员》
【年(卷),期】2001(000)001
【摘要】Delphi有三种字符串类型:短字符串(String[n],n=1..255),存储区为静态分配,大小在编译时确定,这是继承于BPforDOS的类型;字符数组(PChar),主要是为了兼容各类API,在BP7中已经出现,如今在Delphi中更加应用广泛,其存储区可以用字符数组静态分配,也可用GetMem手动分配;而长字符串(AnsiString)是Delphi独有的,其存储区在运行时动态分配,最灵活也最易被滥用。
【总页数】2页(P70-71)
【作者】杜嵩
【作者单位】无
【正文语种】中文
【中图分类】TP311
【相关文献】
1.基于Delphi字符串列表的多指令发送串口助手设计 [J], 赵晓冬;俞轲鑫;谢少伟
2.Delphi代码优化(二)整数篇 [J], 杜嵩
3.Delphi代码优化(三)——浮点篇 [J], 杜嵩
4.Delphi代码优化完结篇 [J], 杜嵩
5.基于Delphi字符串列表的多指令发送串口助手设计 [J], 赵晓冬;俞轲鑫;谢少伟
因版权原因,仅展示原文概要,查看原文内容请购买。
[荐]Delphi基本语法格式
Delphi基本语法格式1. 常量:固定值,不可变数。
1)const常量名 = 常量值(表达式);2)resourcestring常量名 = 字符串(常量);2.变量1)定义Var 名字1,名字2,…名字n:类型;2)命名原则(参考)变量名字 = 类型(缩写) + 作用域(简称) + 确切含义名称3)三种赋值格式变量名:= 值;变量名1: = 变量2;变量名:= 过程或函数的调用;3.类型常量1)类型常量是全局变量并不是一个常量,它进行了预初始化值。
2)定义Const名字:类型 = 值;3)种类简单的类型常量数组类型常量记录类型常量集合类型常量指针类型常量过程类型常量4.数据类型5.用户自定义类型子域类型Type名称=初值…终值;枚举类型Type名称=(值1,值2,值3…值N);数组类型Type名称=Array[下标定义]of类型名Type 名称= [下标定义1,下标定义2…下标定义N] of元素类型或名称= [下标定义1of…Array [下标定义N] of元素类型集合类型Type 名称=set of元素类型指针类型Type名称= ^结点类型记录类型Type名称=Record域名1:类型;域名1:类型;……域名N:类型;end;文件类型Type名称=file of元素类型语句简单语句X := Y + Z; // assignmentRandomize; // procedure call复合语句beginA := B;C := A * 2;end;end之前的最后一条语句末尾分号不是必需的,你可以写成:beginA := B;C := A * 2end;赋值语句在Pascal 语言中赋值语句用冒号-等号操作符“:=”,条件语句If语句对if-then型语句,仅当条件满足时,语句才执行;if CheckBox1.Checked thenShowMessage ('CheckBox1 is checked')对if-then-else型,if语句在两条语句中选择一条执行if CheckBox2.Checked thenShowMessage ('CheckBox2 is checked')elseShowMessage ('CheckBox2 is NOT checked');要注意的是,不能在第一句之后、else 关键词之前加分号,否则编译器将告知语法错误。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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字符串基于引用计数机制,通过引用计数追踪内存中引用同一字符串的字符串变量。 (2)、编译器生成的代码会在操作一个AnsiString字符串前把引用计数+1,操作结束后引用计数-1, 如果引用计数=0时就自动释放整块内存。 (3)、AnsiString字符串的复制 在拷贝字符串的时候,Object Pascal并不是把字符串简单的复制一份,而是采取了引用计数的方法,将两个字符串指向同一个内存空间,同时引用计数加1。当字符串变量被清除的时候,引用计数减1。通过AnsiString字符串的引用计数机制,几个字符串都能指向相同的物理地址。因此,复制字符串仅仅是复制了指针而不是复制实际的字符串。 (4)、AnsiString字符串作为参数 用拷贝方式(值参)传递AnsiString字符串会引起副作用,因为函数执行过程中会产生一个对字符串的额外引用;与此相反,通过引用(var)或常量(const)参数传递不会产生这种情况。 6、AnsiString字符串的赋值。 (1)、将string赋值给另一个string,只是一个简单的指针赋值,不产生copy动作,只是增加string的引用计数; (2)、将一个PChar变量类型赋值给一个string变量类型会产生真正的Copy动作,即将PChar所指向的字符串整个copy到为string分配的内存中; (3)、将string赋值给一个PChar变量类型,只是简单地将string的指针值赋值给PChar变量类型,而string的引用计数并不因此操作而发生变化。因为这种情况PChar会对string产生依赖,当string的引用计数为零自动释放内存空间后,PChar很可能指向一个无效的内存地址,在你的程序你必须小心对付这种情况。 (3)、更新前拷贝机制(copy-on-write) 在给字符串赋值的时候,Object Pascal首先会检查字符串的引用计数是否为1。如果是,按照一般的方法直接赋值即可;否则,就说明有两个以上字符串指向同一个地址,这种情况就复杂多了。Object Pascal使用的是“更新前拷贝机制(copy-on-write)”,为当前字符串另外开辟一个缓冲区,将新内容拷入;同时,原来的字符串引用计数要减1。 注意,一个字符串要等到修改结束,才释放一个引用并分配一个物理字符串。 var
S1,S2:string; begin //给S1赋值,S1的引用计数为1 S1:='Andnowforsomething...'; S2:=S1;//现在S2与S1指向同一个字符串,S1的引用计数为2 //S2现在改变了,所以它被复制到自己的物理空间,并且S1的引用计数减1 S2:=S2+'completelydifferent1'; end; 7、AnsiString字符串的长度。 (1)、AnsiString字符串的最大长度可以到2GB
(2)、AnsiString字符串的初始长度 第一次声明AnsiString时,它是没有长度的,因此在字符串中就没有为字符分配空间。为了对字符串分配空间,用一行字母或另一个字符串对它进行赋值,或者用SetLength()过程。 (3)、AnsiString字符串的内存分配 如果你要增加字符串的长度,而该字符串邻近又没有空闲的内存,即在同一存储单元字符串已没有扩展的余地,这时字符串必须被完整地拷贝到另一个存储单元。当这种情况发生时,Delphi运行时间支持程序会以完全透明的方式为字符串重新分配内存。 (4)、SetLength方法 为了有效地分配所需的存储空间,你可以用SetLength 过程设定字符串的最大长度值“SetLength (String1, 200);”。SetLength 过程只是完成一个内存请求,并没有实际分配内存。它只是把将来所需的内存预留出来,实际上并没有使用这段内存。 注意:代码中用SetLength函数为字符串分配内存,假如内存分配失败,那么程序就会崩溃。 8、AnsiString字符串的内容访问。 能像数组一样对字符串进行索引,但注意索引不要超出字符串的长度。 var
S:string; begin SetLength(S,1); S[1]:='a';//现在S有足够空间来容纳字符 end;
9、AnsiString字符串的类型转换。 (1)、将一个字符串转换为PChar类型时要小心,因为字符串在超出其作用范围时有自动回收的功能,因此当进行P:=PChar(Str)的赋值时,P的作用域(生存期)应当大于Str的作用域。 (2)、字符串与PChar之间的转换。可以把AnsiString强制类型转换为PChar。如果要把PChar的内容复制到AnsiString,直接用赋值语句:StringVar:=PCharVar;
(3)、使用PChar转换AnsiString时,会丢失AnsiString的动态增长和引用计数的功能,所以一定要小心,另外要注意PChar长度的计算和字符串长度一定要同步,否则会出问题。
ShortString类型 1、ShortString在内存中分配的情况
在内存中,字符串就像是一个字符数组,在字符串的第0个元素中存放了字符串的长度,紧跟在后的字符就是字符串本身。 2、ShortString字符串的最大长度 (1)、ShortString缺省的最大长度为256个字节,这表示在ShortString中不能有大于255个字符(1个长度字节+255个字符=256)。相对于AnsiString来说,用ShortString是相当随意的,因为编译器会根据需要为它分配空间。 (2)、能用short类型限定符和一个长度限制来为ShortString分配小于256个字节的空间。 var
S:string[45];//45个字符的ShortString字符串 (3)、不要存放比分配给字符串的空间长度更长的字符。 如果声明了一个变量是string[8],并试图对这个变量赋值为‘a_pretty_darn_long_string’,这