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字符串的值,都会引起释放原先的字符串,而后重新分配一个新的字符串。这一点也是很容易理解,因为字符串在内存中连续存放的,如果不重新分配,那么增加的部分就有可能侵入其他变量的内存区域。

摘自http://www.winu.cn/space-14160-do-blog-id-13424.html

posted @ 2009-03-19 15:42  yuyuhaso  阅读(182)  评论(0编辑  收藏  举报