您现在的位置: 中国教师站 >> 教师关注 >> 电脑技术 >> 编程技术 >> Delphi >> 正文

Google
Delphi之数组
作者:Siny 文章来源:中国教师站cn-teacher 点击数: 更新时间:2007-4-22 15:58:02
nbsp; end;
       有人要问为什么长度是1..(Length+1)而不是Length呢?
       因为后面还要有一位NULL字符,表示结束。可见AnsiString和CC++的兼容性也是很好的。
       如下代码:
       var
          k: AnsiString;
          p:^LongWord;
        begin
          k := 'I am a Delphi fan!';
          p:=@K[1];
          Dec(p,1);
          P^:=13;                     //k.Length被置为13
          showmessage(k);
        end;
      由此我们会知道ANsiString的效率是很高的,他的信息存储于字符串头中。例如我们要取字符串的长度只须读出
      TAnsiString.Length的内容即可。而其cc++的字符串就不行,取字符串的长度要从头读起直到遇到NULL记录下
      读过的字符个数就是长度。可是如果字符串很长效率的差异就显示出来了,比如一个很大的文件?
      前面讲过动态数组赋值的问题,它并不为动态数组单独开辟一块空间,而是简单的把指针指向所赋的数组。只有被赋值的
      数组在改变时才真正分配给他空间。这样做的好处是在赋值的时候会很快。如果被赋值的数组没有改变那就比直接分配空间
      快上许多。另外如果被赋值数组发生改变重新分配空间,只是花费和直接分配空间相同的时间而已。
      有些人会想那么如下代码:
        var
          k,j:AnsiString;
        begin
          k:'123';
          j:='456';
          k:=j;
        end;
       k的空间已经分配,既然k的指针指向了j,那么k原来的空间岂不是浪费,造成了内存垃圾?
       前面说过AnsiString也是动态数组的一种,符合动态数组生存期自管理。
       但实际的情况是:当把一个指针指向一个字符创空间时,他的引用次数位就加1,
       当有指针指向从这个字符串离开时引用次数位就减1,所以当引用次数位为0是就意味着没有人使用了
       就自动释放这段空间。这就是我们所说的生存期自管理技术。
       Type
        //实际分配大小对我们来说意义不大,所以这里我们先不取他                   
        PAnsiString=^TAnsiString;
        TAnsiString= record
           ReferencCount:LongWord;       //引用次数
           Length:LongWord;              //字符串长度
        end;
        var
          k,j: AnsiString;
          P:^LongWord;
          MyAnsiString:PAnsiString;
        begin
        

上一页  [1] [2] [3] [4] [5] [6] 下一页

相关专题:
 
 网友评论:(评论内容只代表网友观点,与本站立场无关!)
GOOGLE广告

阅读排行

| 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 |
中国教师站

中国教师站 版权所有 Copyright © 2006-2020 All Rights Reserved 站长:Sina & Siny
[备用域名:www.JXZYW.Com] 有事请留言有事请留言
【实力成就精品 诚信呵护品牌】

信息产业部备案
苏ICP备06018635号