首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

深入解析 Delphi 字符串類型:ShortString、AnsiString、WideString、PChar

     編輯:Delphi

四大字符串類型

類型別名最大長度內存管理結束符適用場景
ShortStringString[255]255 字符棧/靜態長度字節 (索引 0)舊代碼兼容、固定長度記錄
AnsiStringString ({$H+})2GB引用計數、堆、COW#0 (雙重)默認通用字符串、VCL 組件屬性
WideStringWideString2GBCOM 兼容 (SysAllocString)#0COM/OLE 自動化、XML、WebService
PAnsiChar / PWideCharPChar由緩衝區決定手動 (GetMem/FreeMem)#0API 調用、C/C++ 互操作、緩衝區操作

關鍵差異詳解

1. ShortString (傳統 Pascal 字符串)

var
  S: String[50]; // 靜態分配 51 字節
begin
  S := 'Hello'; // S[0] = #5 (長度), S[1]='H'...
end;
  • 長度存儲在索引 0,Length(S) 讀取 S[0]。
  • 賦值超過聲明長度會截斷。
  • 不支持引用計數,傳值拷貝。

2. AnsiString (長字符串,默認 String)

  • 動態分配,引用計數,寫時複製 (COW)。
  • 隱含 #0 結尾,可直接轉 PChar 給 API。
  • SetLength(S, 100) 顯式調整大小。
  • Trim/TrimLeft/TrimRight 去除空白。

3. 字符數組與 PChar 互轉

var
  Arr: array[0..50] of Char;
  P: PChar;
begin
  P := 'Hello World'; // 字面量分配只讀內存,P 指向其首地址
  Arr := 'Hello';     // 編譯器自動填充 #0
  P := @Arr[0];       // 數組名即首元素地址
end;

{$EXTENDEDSYNTAX ON} (默認) 使字符數組與 PChar 兼容。

4. API 交互最佳實踐

var
  WinDir: array[0..MAX_PATH] of Char;
begin
  GetWindowsDirectory(WinDir, MAX_PATH); // 直接傳數組
  ShowMessage(WinDir); // 自動按 #0 截取
end;

{ 或動態分配 }
var
  Buf: PChar;
begin
  GetMem(Buf, 256);
  try
    GetSystemDirectory(Buf, 256);
    ShowMessage(Buf);
  finally
    FreeMem(Buf);
  end;
end;

字符串轉換函數

  • StrPas(PChar) → ShortString
  • StrPCopy(PChar, String) → PChar
  • PChar(AnsiString):直接強轉,返回內部指針 (只讀上下文安全)。
  • String(PChar):從 #0 終止字符串創建 AnsiString。

編碼注意 (Delphi 2009+)

  • String = UnicodeString (UTF-16),AnsiString 為單獨類型。
  • API 調用需區分 A (Ansi) / W (Wide) 版本,或用 MarshaledString。
  • 舊代碼遷移時注意 SizeOf(Char) 從 1 變為 2。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved