• 字符串及字符指针


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

    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'字符串的堆地址。

  • 相关阅读:
    ios英语口语800句应用源码
    乐够GO应用源码完整版
    学生信息管理系统应用ios源码iPad版
    安卓版蝌蚪播放器客户端应用源码完整版
    一个Brushes笔画应用ios源码完整版
    模仿百度卫士应用最新版源码下载
    高仿QQ的即时通讯应用带服务端软件安装
    较好的IOS新闻客户端应用源码
    中国科学报客户端应用源码
    二叉树基础操作
  • 原文地址:https://www.cnblogs.com/samsonleung/p/1290247.html
Copyright © 2020-2023  润新知