| 類型 | 別名 | 最大長度 | 內存管理 | 結束符 | 適用場景 |
|---|---|---|---|---|---|
| ShortString | String[255] | 255 字符 | 棧/靜態 | 長度字節 (索引 0) | 舊代碼兼容、固定長度記錄 |
| AnsiString | String ({$H+}) | 2GB | 引用計數、堆、COW | #0 (雙重) | 默認通用字符串、VCL 組件屬性 |
| WideString | WideString | 2GB | COM 兼容 (SysAllocString) | #0 | COM/OLE 自動化、XML、WebService |
| PAnsiChar / PWideChar | PChar | 由緩衝區決定 | 手動 (GetMem/FreeMem) | #0 | API 調用、C/C++ 互操作、緩衝區操作 |
var
S: String[50]; // 靜態分配 51 字節
begin
S := 'Hello'; // S[0] = #5 (長度), S[1]='H'...
end;
Length(S) 讀取 S[0]。PChar 給 API。SetLength(S, 100) 顯式調整大小。Trim/TrimLeft/TrimRight 去除空白。var
Arr: array[0..50] of Char;
P: PChar;
begin
P := 'Hello World'; // 字面量分配只讀內存,P 指向其首地址
Arr := 'Hello'; // 編譯器自動填充 #0
P := @Arr[0]; // 數組名即首元素地址
end;
{$EXTENDEDSYNTAX ON} (默認) 使字符數組與 PChar 兼容。
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) → ShortStringStrPCopy(PChar, String) → PCharPChar(AnsiString):直接強轉,返回內部指針 (只讀上下文安全)。String(PChar):從 #0 終止字符串創建 AnsiString。String = UnicodeString (UTF-16),AnsiString 為單獨類型。A (Ansi) / W (Wide) 版本,或用 MarshaledString。SizeOf(Char) 從 1 變為 2。