Delphi、PChar和Char数组的比较

Delphi、PChar和Char数组的比较

          string和Char数组都是一块内存, 其中存放连续的字符. string保存具体字符的内存对用户 是透明的, 由Delphi管理它的分配, 复制和释放, 用户不能干预(其实也可以, 不过是通过 非法途径). Char数组就不必说了吧? 
         PChar是一个指针, 它的大小只有32位. 定义时由Delphi自动填0. 要将PChar作为字符串 使用的话必须自己分配内存用完必须自己释放. PChar型字符串由#0表示字符串结尾 Delphi所提供的相关PChar字符串的操作都是判断#0来决定字符串的结尾的。 因为PChar是指针,所以它能指向任何地方(也就是说它不一定非要指向字符串不可)。
        把一个String赋值给PChar只是将String中保存具体字符串的内存的地址给PChar 变量. 当然也可以把Char数组第一个元素的地址给PChar。至于 哪个占用内存小, Char数组<PChar(指分配过字符串的)<string(除了具体字符串外 还 包含字符串长度) 如果空字符串那么

            PChar<String<array [0..n] of Char 
       从速度来说毫无疑问string最慢,,例如: 作为参数传递(非var调用时)给过程时string将整个字串的副本传递过去,,PChar将指针 本身的副本传递过去(32位),,Char数组和PChar一样, 传递的是第一个元素的地址副本.。不过就灵活性来说string最高,而且Delphi支持的函数最多。另外可以将String作为 Buffer使用(因为它当中可以包含字符0)。

amo (2000-9-20 1:35:26) 
----------------------------------------------------------------------------------
在Delphi2.0以后的版本中, 
string分两种, 
    一种是与Pascal传统string相兼容,叫ShortString,
    它的存储结构如下: 
     +---------------------+    
     | 1Byte |    字符串内容 | 
     +---------------------+ 
     0         1 ...... 
      其中第一个字节为字符串的长度。 
      所以ShortString所能包括的字符串长度不能大于255。 
    另一种是叫长字符串AnsiString,    它就是一个指向字符串的指针,不过具体的存储有些特别。 
    它的存储结构如下: 
    +-----------------------+ 
    | 4B | 4B |    字符串内容 | 
    +-----------------------+ 
    -8     -4     0    ...... 
           其中,AnsiString指向字符串第一个字符, 
           在第一个字符的反方向第1到第4的4个字节表示字符串长度,第5到第8的4个字节表字符串被引用的次数。

            pchar就是纯指向字符串(#0字符结尾)的指针,与C语言中的char *是一样的。

            char数组也是指向字符串的指针,它与pchar的区别在于: 
           1.char数组(均指非动态数组)一旦定义好,它的长度就固定了; 
            2.char数组的地址是常量,不能另赋其它值,不能象pchar一样, 
           如: sPchar:pchar; sArray1,sArray2:array[0..80]of char; 
            sPChar:=sArray2; sPChar;=sArray1; 
            但不能sArray2:=sArray1; 
            char数组就相当于const char *

           要说速度最快当然是纯指针操作的pchar与char数组最快啦 ,所谓占内存最少,效率更高, 不知老兄你想进行什么方面的应用, 
一般对string,pchar或char数组,不用考虑这些。对编程而言,如果在Delphi或C++Builder中使用,可尽量使用AnsiString,Borland公司对它已经进行了非常完美的内部处理,使用非常方便。 

          如果涉及到Windows API或混合编程等,接口部分一般使用pchar。char数组使用的比较少了,因为多数可以用char数组的地方,现在比较流行的作法是定义一个ansistring, 再用setlength来设定它的长度。

lycwg (2001-1-12 11:53:20) 
------------------------------------------------------------
三、字符串string 字符数组与指向字 
  符串的指针pchar的区别与联系 
  这3者的基本概念相同,但有一些非常细微的差别,在编程时稍不注意就会出错,需高度重视。 
  1、使用指向字符串的指针,如果不是以0结尾,运行时就会出现错误。为了避免这种错误,需要在字符串结尾人工加入0 即char(0),或用strpcopy函数在字符串结尾自动加0。 
  例1: 指向字符串的指针,如果不是以0结尾,运行时会出现错误: 
  {s[0]=3 s[1]='n' s[2]='e' s[3]='w'} 
  var 
       s:string; 
             p:pchar; 
  begin 
       s:='new'; 
         label1.caption:=s; {new} 
         label2.caption:=intTostr(integer(s[0]));{3是字符串的长度} 
       p:=@s[1];{不是以0结尾,莫用pchar型指针} 
       label3.caption:=strpas(p); {运行时出现错误} 
  end;

  例2:在字符串结尾人工加入0即char(0),可使用指向字符串的指针。 
  {s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;} 
  {p-->'new'} 
  var 
              s:string; 
              p:pchar; 
  begin 
       p:=@s[1]; 
       s:='new'+char(0); {以0结尾,可用pchar型指针} 
       label1.caption:=strpas(p); {new}

注意:

procedure    GetMem(var    P:    Pointer;    Size:    Integer);   
    
   //分配动态内存   
    
   function    StrPas(const    Str:    PChar):    string;   
    
   //将PChar转换为String

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值