乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      關(guān)于Delphi中的字符串的淺析

       一路狂奔141 2014-05-12

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

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

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

      • 短字符串(Short String)
      • 長(zhǎng)字符串(Long String)
      • 寬字符串(Wide String)
      • 零結(jié)尾字符串(Null-Terminated String)、PChar和字符數(shù)組

      1、短字符串(Short String)

      固定長(zhǎng)度,最大字符數(shù)個(gè)數(shù)為255,短字符串也成為長(zhǎng)度字節(jié)(Length-byte)字符串,這時(shí)因?yàn)槎套址牡?個(gè)元素包含了這個(gè)字符串的長(zhǎng)度(字符串中字符的個(gè)數(shù))。因此ShortString的缺省最大長(zhǎng)度為256個(gè)字節(jié)(255個(gè)字符+1個(gè)長(zhǎng)度字節(jié)=256),聲明一個(gè)短字符串有兩種方式,如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      var
        S: ShortString;   { 255個(gè)字符長(zhǎng)度,256個(gè)字節(jié)}
        S1: String[255];  { S1和S的字符類型一樣}
        Len: Integer;
      begin
        S := 'Hello';
        Len := Ord(S[0]); { Len現(xiàn)在包含S的長(zhǎng)度為5,Ord函數(shù)可以把一個(gè)字符類型轉(zhuǎn)換為整數(shù)類型}
        Len := SizeOf(S); { Len現(xiàn)在包含的是ShortString類型的大小,為256字節(jié)} 
      end;

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

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

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      var
        S: string[8];
        i: Integer;
      begin
        S := 'a_pretty_darn_long_string';
        { 因?yàn)镾只有8個(gè)字符大小,
        因此s的實(shí)際存儲(chǔ)的內(nèi)容為“a_pretty”}
        i := 10;
        S[i] := 's';
        { 因?yàn)镾只有8個(gè)字符大小,
        試圖改寫第10個(gè)元素,將會(huì)使內(nèi)存混亂}
      end;

      2、長(zhǎng)字符串(Long String)

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

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

      1
      2
      var
        S: string;

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

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

      0013

      3、寬字符串(Wide String)

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

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

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      var
        S: string;
        { 在Delphi 7中默認(rèn)string等同于AnsiString}
        WS: WideString;
      begin
        S := '世界你好';
        WS := S;
        ShowMessage(S[1]);  { 此時(shí)無任何顯示,因?yàn)镾[1]取出的是‘世’的一半}
        ShowMessage(WS[1]); { 顯示‘世’}
      end;

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

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

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

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

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

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

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

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

      1
      2
      3
      4
      5
      6
      7
      8
      9
      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變量

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

      運(yùn)行下面程序:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      var
        Text: PChar;    { 聲明為PChar類型}
        Str: string;    { 聲明為String類型}
      begin
        Text := 'This is a test.';             { 都被賦予了相同的字符串}
        Str := 'This is a test.';
        ShowMessage(IntToStr(SizeOf(Text)));   { 4字節(jié),實(shí)質(zhì)是指針}
        ShowMessage(IntToStr(SizeOf(Str)));    { 也是4字節(jié),也是指針}
      end;

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

      1
      2
      3
      4
      5
      6
      7
      var
        Text: PChar;
      begin
        Text := 'This is a test.';
        MessageBox(0, Text, 'Test Message', 0);
        { 這里Text直接聲明為了PChar類型,字符串常量可以直接用}
      end;

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

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      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個(gè)元素的地址,
        也就是整個(gè)字符數(shù)組的首地址}
        MessageBox(0, Text, 'Test Message', 0);
      end;

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

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

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      var
        Text1: array[0..14] of Char{ 大小為15個(gè)字符}
        Text2: array[0..20] of Char{ 大小為21個(gè)字符}
      begin
        Text1 := 'This is a test.';   {Text1和Text2的字符長(zhǎng)度都為15個(gè)字符}
        Text2 := 'This is a test.';
        MessageBox(0, Text1, 'Test Message 1', 0);
        {因?yàn)門ext1的字符長(zhǎng)度超過了其聲明的大小,因?yàn)闀?huì)內(nèi)存訪問混亂,顯示換亂}
        MessageBox(0, Text2, 'Test Message 2', 0);
        {Text2的字符長(zhǎng)度比起聲明的大小要小,因?yàn)檎TL問,顯示正確}
      end;

      顯示結(jié)果如下:

      0014   0015

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

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多