DELPHI的字符串
Delphi字符串的特点。
1。使用堆进行分配。自动进行分配与释放的。
2。字符串变量是指向字符串地址的指针。
s1:=s2;即把s2的指针内容复值给s1.s1与s2指向同一地址。
3。字符串地址的负4字节处保存字符串的长度。负8字节处保存此字符串的引用次数。
测试程序:
var
s1,s2:string;
begin
{ TODO -oUser -cConsole Main : Insert code here }
s1:='abcd';
p:=Pointer(Integer(Pointer(s1))-4);
writeln(Format('s1的值:%s 地址:%p 长度:%d 引用次数:%d',[s1,Pointer(s1),Integer(p^),
Integer(Pointer(Integer(Pointer(s1))-8)^)]));
s2:=s1;
writeln(Format('s2的值:%s 地址:%p 引用次数:%d',[s2,Pointer(s2),
Integer(Pointer(Integer(Pointer(s2))-8)^)]));
s2:=s2+'aaaa';
writeln(Format('s2的值:%s 地址:%p 引用次数:%d',[s2,Pointer(s2),
Integer(Pointer(Integer(Pointer(s2))-8)^)]));
s1:=s1+'abcd';
p:=Pointer(Integer(Pointer(s1))-4);
writeln(Format('s1的值:%s s1的地址:%p s1的长度:%d',[s1,Pointer(s1),Integer(p^)]));
s1:=Concat(s1,' Concat');
writeln(Format('s1的值:%s s1的地址:%p',[s1,Pointer(s1)]));
end.
运行结果:
s1的值:abcd 地址:008F0918 长度:4 引用次数:1
s2的值:abcd 地址:008F0918 引用次数:2
s2的值:abcdaaaa 地址:008F0998 引用次数:1
s1的值:abcdabcd s1的地址:008F09E8 s1的长度:8
s1的值:abcdabcd Concat s1的地址:008F0A3C
可以看出,每一次改变s1字符串的值,都会引起释放原先的字符串,而后重新分配一个新的字符串。这一点也是很容易理解,因为字符串在内存中连续存放的,如果不重新分配,那么增加的部分就有可能侵入其他变量的内存区域。