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