天天看點

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:[email protected][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:[email protected][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