字符串及字符指针

近来在学习字符串的一些操作,对字符串有些认识:

1、字符串在使用时才动态分配的。

2、程序在声明字符串变量时,实际分配的是32位的内存空间的一个指针。该指针指向存储实际字符串的内存地址。当字符串为空时,其指针值为nil。

所以  str:='Borland Delphi';

       sizeof(str);返回的结果将是4,而不是字符串的长度。

3、字符串的内容的内存在堆中分配。(但如果是如str:=Form1.Caption常量,则是在栈中分配)

4、不同的字符串变量,如果是存储一样的内容,则内存中只存储一份内容。字符串变量的地址是一样的,采用引用计数技术。只有改变字符串内容时,才采用copy-on -write技术,分配另一内存进行存储。

5、字符串与一维字符数组很相似。但区别在于字符串的下标是以str[1]开始,而且str[0]是不可访问的。并且以#0结尾。

 1procedure TForm2.Button1Click(Sender: TObject);
 2var
 3  a,b,c:string;
 4  p:Pint;
 5  q:Pchar;
 6begin
 7  memo1.Clear;
 8  with memo1.Lines do
 9  begin
10    a:='Delphi';
11    b:='Delphi';
12    c:=a;
13    p:=@a;
14    q:=@a[1];//不能使用q:=@a[0];
15     Add('a''s address:   '+inttostr(integer(@a)));
16     Add('b''s address:   '+inttostr(integer(@b)));
17     Add('c''s address:   '+inttostr(integer(@c)));
18     Add('In a:   '+inttostr(integer(a)));
19     Add('In b:    '+inttostr(integer(b)));
20     Add('In c:    '+inttostr(integer(c)));
21      Add('sizeof a:    '+inttostr(sizeof(a)));
22      add('a''s adress'+inttostr(integer(p)));
23    while q^<>#0 do
24     begin
25      add(q^+'  ;address'+inttostr(integer(q)));
26      inc(q);
27     end;
28  end;//with lines
29end;
30

执行的结果如下:

一个很奇怪的结果是字符串a与b,c的地址竟然不同。如果将q=@a[1];这一语句去掉,则 a,b,c地址是一致的。为什么会改变呢?而且地址是低位的地址(已经不是'Delphi'的地址了)。难道在q=@a[1]时,复制了一份到另一内存空间?如果有哪位大侠知道,请教小弟一声。

从字符指针,查询每个字符的地址可以看到,Delphi2009 的char是unicode的,每个字符占2个字节。

b c 地址一致,是因为他们都指向'Delphi'字符串的堆地址。

原文地址:https://www.cnblogs.com/samsonleung/p/1290247.html