zoukankan      html  css  js  c++  java
  • String 中的秘密

    Navigation:  数据类型相关 > Delphi 的字符及字符串 >

    [3] - String 中的秘密

    Previous pageReturn to chapter overviewNext page
     

    //String 的指针地址及实际的内存地址

    var

    str: string;

    pstr: PString;

    pc: PChar;

    begin

    {在没有给 str 赋值以前, 既然声明了, 就有了指针地址(@str):}

    ShowMessage(IntToStr(Integer(@str))); {1244652; 这是在栈中的 str 的指针地址}

     

    {但现在还没有分配真正储存字符串内存}

    ShowMessage(IntToStr(Integer(str))); {0; 0 就是 null}

     

    str := 'Delphi';

     

    {一旦赋值后...}

    ShowMessage(IntToStr(Integer(@str))); {1244652; 这是在栈中的 str 的指针地址}

    ShowMessage(IntToStr(Integer(str))); {4580800; 这是在堆中的 str 的实际地址}

     

    {通过指针地址获取字符串, 其中的 pstr 是前面定义的字符串指针}

    pstr := @str;

    ShowMessage(pstr^); {Delphi}

     

    {通过实际地址获取字符串, 其中的 pc 是前面定义的字符指针}

    pc := PChar(Integer(str));

    ShowMessage(pc);   {Delphi}

    end;

    --------------------------------------------------------------------------------

    一个字符串(AnsiString 或 String, 譬如是 "Form1" )在内存中是这样储存的:

     

        From1

     

    黄色区域是真正存字符串的位置, 前面说的字符串所在的内存地址, 就是本例中的 "F" 所在的位置;

    蓝色的四个字节储存一个 Integer 值, 表示字符串的长度;

    最后红色的一个字节储存一个空字符(#0), 表示字符串的结束, 同时也是为了和 Windows 的 null 结束的字符串兼容;

    绿色的四个字节也是一个 Integer 值, 表示该字符串被引用的次数(也就是有几个字符串的指针指向它).

     

    还是看例子吧:

    --------------------------------------------------------------------------------

     

    var

    str,s1,s2: string;

    pint: PInteger;

    begin

    str := Self.Text; {把窗体标题给它吧; 现在 str 指向了窗体标题所在的内存位置}

    s1 := str;       {给 s1 赋值}

    s2 := str;       {给 s2 赋值; 现在窗体标题已经有了 str、s1、s2 三个引用}

     

    {str、s1、s2 的指针肯定不一样; 但现在指向内存的同一个位置, 测试:}

    ShowMessage(IntToStr(Integer(str))); {15190384}

    ShowMessage(IntToStr(Integer(s1))); {15190384}

    ShowMessage(IntToStr(Integer(s2))); {15190384}

     

    {向左偏移 4 个字节就是字符串长度的位置, 读出它来(肯定是5):}

    pint := PInteger(Integer(str) - 4);

    ShowMessage(IntToStr(pint^));     {5}

     

    {向左偏移 8 个字节就是字符串的引用计数, 读出它来(肯定是3):}

    pint := PInteger(Integer(str) - 8);

    ShowMessage(IntToStr(pint^));     {3}

    end;

    --------------------------------------------------------------------------------

    当某段字符串内存的引用计数为 0 时, Delphi 就会自动释放它; 这也是字符串不需要手动释放的原因.

    我在测试时发现: 所有常量和非全局的变量的引用计数一直是 "-1".

    --------------------------------------------------------------------------------

     

    我的同类文章

    更多文章
    http://blog.csdn.net/diligentcatrich/article/details/7594007
  • 相关阅读:
    linux设备驱动模型二【转】
    Linux设备驱动模型【转】
    内核学习方法,编译、调试等常见问题【转】
    第十四章 netlink机制--基于Linux3.10【转】
    手把手教你把Vim改装成一个IDE编程环境(图文)【转】
    Netlink通信机制【转】
    mac电脑的使用
    【转】不要使用SBJSON(json-framework)
    【转】IOS中Json解析的四种方法
    【转】iOS程序自动检测更新的实现 -- 思路不错
  • 原文地址:https://www.cnblogs.com/findumars/p/5218057.html
Copyright © 2011-2022 走看看