關(guān)于Delphi中的字符串的詳細(xì)分析
來源:易賢網(wǎng) 閱讀:1468 次 日期:2015-08-27 16:41:15
溫馨提示:易賢網(wǎng)小編為您整理了“關(guān)于Delphi中的字符串的詳細(xì)分析”,方便廣大網(wǎng)友查閱!

只是淺淺的解析下,讓大家可以快速的理解字符串。

其中的所有代碼均在Delphi7下測試通過。

Delphi 4,5,6,7中有字符串類型包括了:

短字符串(Short String)

長字符串(Long String)

寬字符串(Wide String)

零結(jié)尾字符串(Null-Terminated String)、PChar和字符數(shù)組

1、短字符串(Short String)

固 定長度,最大字符數(shù)個數(shù)為255,短字符串也成為長度字節(jié)(Length-byte)字符串,這時因為短字符串的第0個元素包含了這個字符串的長度(字符 串中字符的個數(shù))。因此ShortString的缺省最大長度為256個字節(jié)(255個字符+1個長度字節(jié)=256),聲明一個短字符串有兩種方式,如 下:

var

S: ShortString; { 255個字符長度,256個字節(jié)}

S1: String[255]; { S1和S的字符類型一樣}

Len: Integer;

begin

S := 'Hello';

Len := Ord(S[0]); { Len現(xiàn)在包含S的長度為5,Ord函數(shù)可以把一個字符類型轉(zhuǎn)換為整數(shù)類型}

Len := SizeOf(S); { Len現(xiàn)在包含的是ShortString類型的大小,為256字節(jié)}

end;

以上例子通過S[0]可以獲得S的字符串長度,當(dāng)然也可以用Length函數(shù)來確定一個短字符串的長度。

可以通過數(shù)組的下標(biāo)來訪問ShortString中的一個特定位置的字符,具體使用參看下面例子和注釋說明:

var

S: string[8];

i: Integer;

begin

S := 'a_pretty_darn_long_string';

{ 因為S只有8個字符大小,

因此s的實際存儲的內(nèi)容為“a_pretty”}

i := 10;

S[i] := 's';

{ 因為S只有8個字符大小,

試圖改寫第10個元素,將會使內(nèi)存混亂}

end;

2、長字符串(Long String)

長字符串 (AnsiString)是一種動態(tài)分配的字符串,其大小只受可用內(nèi)存的限制。聲明一個長字符串,只需要用關(guān)鍵字String不加大小參數(shù)即可。

在Delphi 7中AnsiString包含的字符是用單字節(jié)存儲的。

var

S: string;

由于是動態(tài)分配的,一次可以隨意修改字符串,而不用擔(dān)心對其他的影響,也不用擔(dān)心越界的問題。String類型沒有0元素,試圖存取String類型的0元素會產(chǎn)生一個編譯錯誤。

通過Length函數(shù)也可以獲得長字符串的長度,也可以通過SetLength過程為長字符串設(shè)置長度。其在內(nèi)存中分配情況如下:

名單

3、寬字符串(Wide String)

寬字符串和長字符串一樣,大小只受有效內(nèi)存的限制,并實行動態(tài)分配。

在Delphi 7 中WideString被實現(xiàn)為2個字節(jié)存儲一個字符,用WideString來處理多字節(jié)字符是十分方便的。如:

var

S: string;

{ 在Delphi 7中默認(rèn)string等同于AnsiString}

WS: WideString;

begin

S := '世界你好';

WS := S;

ShowMessage(S[1]); { 此時無任何顯示,因為S[1]取出的是‘世’的一半}

ShowMessage(WS[1]); { 顯示‘世’}

end;

4、零結(jié)尾字符串(Null-Terminated String)、PChar和字符數(shù)組

在C和C++中沒有真正的字符串?dāng)?shù)據(jù)類型,都是通過以Null結(jié)尾(0)的字符數(shù)組來實現(xiàn)的,字符數(shù)組沒有長度字節(jié),因此只能通過結(jié)尾的Null標(biāo) 志來作為字符串的字符結(jié)束標(biāo)志。又因為Windows是用C編寫的,很多Windows函數(shù)要用到以字符數(shù)組作為參數(shù),但Pascal字符串類型不是字符 數(shù)組,因為為了讓Pascal字符串也能與Windows兼容,就需要一個字符串?dāng)?shù)組,PChar類型正是符合這種需求,在任何需要字符數(shù)組的地方都可用 PChar。

雖然AnsiString和WideString都已經(jīng)實現(xiàn)了NULL

相應(yīng)的也有PAnsiChar和PWideChar,分別對應(yīng)于AnsiChar字符和WideChar字符。

例如:Windows MessageBox函數(shù),此函數(shù)聲明如下:

function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;

第二個和第三個參數(shù)需要一個指向字符數(shù)組的指針,為了可以調(diào)用此函數(shù),有以下三種方法來實現(xiàn)

1、PChar()類型轉(zhuǎn)換

var

Text: string;

Caption: string;

begin

Text := 'This is a test.';

Caption := 'Test Message';

MessageBox(0, PChar(Text), PChar(Caption), 0);

{ 這里PChar用來把string類型轉(zhuǎn)換為Null結(jié)尾的字符串}

end;

其中

2、PChar變量

我們先做一個實現(xiàn),看看PChar類型到底是啥呢?

運行下面程序

var

Text: PChar; { 聲明為PChar類型}

Str: string; { 聲明為String類型}

begin

Text := 'This is a test.'; { 都被賦予了相同的字符串}

Str := 'This is a test.';

ShowMessage(IntToStr(SizeOf(Text))); { 4字節(jié),實質(zhì)是指針}

ShowMessage(IntToStr(SizeOf(Str))); { 也是4字節(jié),也是指針}

end;

通過上面的程序,我們知道Text只不過是一個指針而已。

var

Text: PChar;

begin

Text := 'This is a test.';

MessageBox(0, Text, 'Test Message', 0);

{ 這里Text直接聲明為了PChar類型,字符串常量可以直接用}

end;

指針Text指向了這樣一個內(nèi)存區(qū)域,一個包含Null的結(jié)尾的’This is a test’字符串的區(qū)域。其等同于下面的代碼:

const

TempString: array[0..15] of Char = 'This is a test.'#0;

var

Text: PChar;

begin

Text := @TempString[0];

{Text指向Null結(jié)尾的TempString字符數(shù)組的第0個元素的地址,

也就是整個字符數(shù)組的首地址}

MessageBox(0, Text, 'Test Message', 0);

end;

3、Char類型字符數(shù)組

最有還可以用Char數(shù)組來代替PChar,代碼如下:

var

Text1: array[0..14] of Char; { 大小為15個字符}

Text2: array[0..20] of Char; { 大小為21個字符}

begin

Text1 := 'This is a test.'; {Text1和Text2的字符長度都為15個字符}

Text2 := 'This is a test.';

MessageBox(0, Text1, 'Test Message 1', 0);

{因為Text1的字符長度超過了其聲明的大小,因為會內(nèi)存訪問混亂,顯示換亂}

MessageBox(0, Text2, 'Test Message 2', 0);

{Text2的字符長度比起聲明的大小要小,因為正常訪問,顯示正確}

end;

顯示結(jié)果如下:

名單

關(guān)于字符串就先淺淺的談到這個,以后再深入了解。

更多信息請查看IT技術(shù)專欄

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機網(wǎng)站地址:關(guān)于Delphi中的字符串的詳細(xì)分析
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報警專用圖標(biāo)