PChar,PAnsiChar,String,AnsiString,Char數組,AnsiChar數組之間的轉換關系見下圖
通過轉換鏈,可以實現任意兩個類型之間的互轉。如PChar轉PAnsiChar,根據轉換鏈可知 Dest := PAnsiChar(AnsiString(Source)),同理PAnsiChar轉PChar為 Dest:= PChar(String(Source))
如果轉換結果最終為string,可以無需String轉換,如Array[0..n] of AnsiChar轉string,轉換鏈為 Dest := Source
由此可以得出結論
1.Ansi和Wide之間的轉換需要通過AnsiString或String轉換
2.數組和指針的轉換盡量采用拷貝的方式,如采用指針指向方式,需注意值的更改影響
3.任意類型轉字符串都會進行拷貝,而不是指針指向,所以原內存的更改不會影響新值
附測試代碼和測試結果
procedure TForm1.btn1Click(Sender: TObject);
var
LAnsiArray: array[ 0.. 20] of AnsiChar;
LCharArray: array[ 0.. 20] of Char;
LPAnsiChar: PAnsiChar;
LPChar: PChar;
LAnsiStr: AnsiString;
LStr: string;
begin
mmo1.Lines.Add( ' 直接賦值輸出******** ');
LAnsiArray := ' AnsiChar數組 ';
mmo1.Lines.Add(LAnsiArray);
LCharArray := ' WideChar數組 ';
mmo1.Lines.Add(LCharArray);
LPAnsiChar := ' PAnsiChar字符串 ';
mmo1.Lines.Add(LPAnsiChar);
LPChar := ' PChar字符串 ';
mmo1.Lines.Add(LPChar);
LAnsiStr := ' AnsiString字符串 ';
mmo1.Lines.Add(LAnsiStr);
LStr := ' string字符串 ';
mmo1.Lines.Add(LStr);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn2Click(Sender: TObject);
var
LAnsiArray: array[ 0.. 20] of AnsiChar;
LPAnsiChar: PAnsiChar;
begin
mmo1.Lines.Add( ' PAnsiChar<->AnsiChar[]******** ');
// 將LPAnsiChar內容拷貝到LAnsiArray內存上
LPAnsiChar := ' PAnsiChar字符串 ';
StrCopy(LAnsiArray, LPAnsiChar);
mmo1.Lines.Add(LAnsiArray);
// 給PAnsiChar分配空間,然后將AnsiChar數組數據拷貝到該空間
GetMem(LPAnsiChar, 30);
StrCopy(LPAnsiChar, @LAnsiArray[ 0]);
LAnsiArray[ 0] := ' Z ';
mmo1.Lines.Add(LPAnsiChar);
FreeMem(LPAnsiChar);
// 將LPAnsiChar指針指向了AnsiChar數組,所以數組改變會影響PAnsiChar
LPAnsiChar := LAnsiArray;
mmo1.Lines.Add(LPAnsiChar);
LAnsiArray[ 0] := ' X ';
mmo1.Lines.Add(LPAnsiChar);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn3Click(Sender: TObject);
var
LPAnsiChar: PAnsiChar;
LAnsiStr: AnsiString;
begin
mmo1.Lines.Add( ' AnsiString<->PAnsiChar******** ');
LAnsiStr := ' AnsiString字符串 ';
// LPAnsiChar的指針指向LAnsiStr地址
LPAnsiChar := PAnsiChar(LAnsiStr);
// LAnsiStr重新分配地址,賦值,對LPAnsiChar沒影響
LAnsiStr := ' ZZZZZZZ字符串 ';
mmo1.Lines.Add(LPAnsiChar);
// LAnsiStr的指針指向LPAnsiChar指針指向的地址
LAnsiStr := LPAnsiChar;
mmo1.Lines.Add(LAnsiStr);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn4Click(Sender: TObject);
var
LPChar: PChar;
LAnsiStr: AnsiString;
begin
mmo1.Lines.Add( ' AnsiString<->PCharr******** ');
LPChar := ' PChar字符串 ';
LAnsiStr := AnsiString(LPChar);
mmo1.Lines.Add(LAnsiStr);
LPChar := PChar( string(LAnsiStr));
mmo1.Lines.Add(LPChar);
end;
procedure TForm1.btn5Click(Sender: TObject);
var
LAnsiArray: array[ 0.. 20] of AnsiChar;
LCharArray: array[ 0.. 20] of Char;
LPAnsiChar: PAnsiChar;
LPChar: PChar;
LAnsiStr: AnsiString;
LStr: string;
begin
mmo1.Lines.Add( ' All->String******** ');
LAnsiArray := ' AnsiChar數組 ';
// 這是拷貝操作,不是指針指向,所以改變數組值對LStr沒影響
LStr := LAnsiArray;
LAnsiArray[ 0] := ' X ';
mmo1.Lines.Add(LStr);
LCharArray := ' WideChar數組 ';
// 這是拷貝操作,不是指針指向,所以改變數組值對LStr沒影響
LStr := LCharArray;
LCharArray[ 0] := ' X ';
mmo1.Lines.Add(LStr);
LPAnsiChar := ' PAnsiChar字符串 ';
LStr := LPAnsiChar;
mmo1.Lines.Add(LStr);
LPChar := ' PChar字符串 ';
// 這是拷貝操作,不是指針指向
LStr := LPChar;
mmo1.Lines.Add(LStr);
LAnsiStr := ' AnsiString字符串 ';
// 這是拷貝操作,不是指針指向
LStr := LAnsiStr;
mmo1.Lines.Add(LStr);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn6Click(Sender: TObject);
var
LAnsiStr: AnsiString;
LStr: string;
begin
mmo1.Lines.Add( ' String->AnsiString******** ');
LStr := ' string字符串 ';
LAnsiStr := AnsiString(LStr);
mmo1.Lines.Add(LAnsiStr);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn7Click(Sender: TObject);
var
LPChar: PChar;
LStr: string;
begin
mmo1.Lines.Add( ' String->PChar******** ');
LStr := ' string字符串 ';
LPChar := PChar(LStr);
mmo1.Lines.Add(LPChar);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn8Click(Sender: TObject);
var
LCharArray: array[ 0.. 20] of Char;
LStr: string;
begin
mmo1.Lines.Add( ' String->Char[] ');
LStr := ' string字符串 ';
StrCopy(LCharArray, PChar(LStr));
mmo1.Lines.Add(LCharArray);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn9Click(Sender: TObject);
var
LCharArray: array[ 0.. 20] of Char;
LPChar: PChar;
begin
mmo1.Lines.Add( ' PChar<->Char[]******** ');
// 將LPChar內容拷貝到LCharArray內存上
LPChar := ' PChar字符串 ';
StrCopy(LCharArray, LPChar);
mmo1.Lines.Add(LCharArray);
// 給PChar分配空間,然后將Char數組數據拷貝到該空間
GetMem(LPChar, 30);
StrCopy(LPChar, @LCharArray[ 0]);
LCharArray[ 0] := ' Z ';
mmo1.Lines.Add(LPChar);
FreeMem(LPChar);
// 將LPChar指針指向了Char數組,所以數組改變會影響PChar
LPChar := LCharArray;
mmo1.Lines.Add(LPChar);
LCharArray[ 0] := ' X ';
mmo1.Lines.Add(LPChar);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn10Click(Sender: TObject);
var
LCharArray: array[ 0.. 20] of Char;
LPChar: PChar;
LStr: string;
begin
LCharArray := ' Char數組 ';
LPChar := LCharArray;
// PChar轉String,做的是拷貝,不是指針指向
LStr := LPChar;
mmo1.Lines.Add( ' Char[]: ' + LCharArray);
mmo1.Lines.Add( ' PChar: ' + LPChar);
mmo1.Lines.Add( ' String: ' + LStr);
// 更改數組的值
LCharArray[ 0] := ' X ';
mmo1.Lines.Add( ' Char[]: ' + LCharArray);
mmo1.Lines.Add( ' PChar: ' + LPChar);
mmo1.Lines.Add( ' String: ' + LStr);
end;
procedure TForm1.btn11Click(Sender: TObject);
var
LPChar: PChar;
LPAnsiChar: PAnsiChar;
begin
mmo1.Lines.Add( ' PChar<->PAnsiChar ');
LPAnsiChar := ' PAnsiChar字符串 ';
LPChar := PChar(String(LPAnsiChar));
mmo1.Lines.Add(LPChar);
LPChar := ' PChar字符串 ';
LPAnsiChar := PAnsiChar(AnsiString(LPChar));
mmo1.Lines.Add(LPAnsiChar);
mmo1.Lines.Add( '');
end;
var
LAnsiArray: array[ 0.. 20] of AnsiChar;
LCharArray: array[ 0.. 20] of Char;
LPAnsiChar: PAnsiChar;
LPChar: PChar;
LAnsiStr: AnsiString;
LStr: string;
begin
mmo1.Lines.Add( ' 直接賦值輸出******** ');
LAnsiArray := ' AnsiChar數組 ';
mmo1.Lines.Add(LAnsiArray);
LCharArray := ' WideChar數組 ';
mmo1.Lines.Add(LCharArray);
LPAnsiChar := ' PAnsiChar字符串 ';
mmo1.Lines.Add(LPAnsiChar);
LPChar := ' PChar字符串 ';
mmo1.Lines.Add(LPChar);
LAnsiStr := ' AnsiString字符串 ';
mmo1.Lines.Add(LAnsiStr);
LStr := ' string字符串 ';
mmo1.Lines.Add(LStr);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn2Click(Sender: TObject);
var
LAnsiArray: array[ 0.. 20] of AnsiChar;
LPAnsiChar: PAnsiChar;
begin
mmo1.Lines.Add( ' PAnsiChar<->AnsiChar[]******** ');
// 將LPAnsiChar內容拷貝到LAnsiArray內存上
LPAnsiChar := ' PAnsiChar字符串 ';
StrCopy(LAnsiArray, LPAnsiChar);
mmo1.Lines.Add(LAnsiArray);
// 給PAnsiChar分配空間,然后將AnsiChar數組數據拷貝到該空間
GetMem(LPAnsiChar, 30);
StrCopy(LPAnsiChar, @LAnsiArray[ 0]);
LAnsiArray[ 0] := ' Z ';
mmo1.Lines.Add(LPAnsiChar);
FreeMem(LPAnsiChar);
// 將LPAnsiChar指針指向了AnsiChar數組,所以數組改變會影響PAnsiChar
LPAnsiChar := LAnsiArray;
mmo1.Lines.Add(LPAnsiChar);
LAnsiArray[ 0] := ' X ';
mmo1.Lines.Add(LPAnsiChar);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn3Click(Sender: TObject);
var
LPAnsiChar: PAnsiChar;
LAnsiStr: AnsiString;
begin
mmo1.Lines.Add( ' AnsiString<->PAnsiChar******** ');
LAnsiStr := ' AnsiString字符串 ';
// LPAnsiChar的指針指向LAnsiStr地址
LPAnsiChar := PAnsiChar(LAnsiStr);
// LAnsiStr重新分配地址,賦值,對LPAnsiChar沒影響
LAnsiStr := ' ZZZZZZZ字符串 ';
mmo1.Lines.Add(LPAnsiChar);
// LAnsiStr的指針指向LPAnsiChar指針指向的地址
LAnsiStr := LPAnsiChar;
mmo1.Lines.Add(LAnsiStr);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn4Click(Sender: TObject);
var
LPChar: PChar;
LAnsiStr: AnsiString;
begin
mmo1.Lines.Add( ' AnsiString<->PCharr******** ');
LPChar := ' PChar字符串 ';
LAnsiStr := AnsiString(LPChar);
mmo1.Lines.Add(LAnsiStr);
LPChar := PChar( string(LAnsiStr));
mmo1.Lines.Add(LPChar);
end;
procedure TForm1.btn5Click(Sender: TObject);
var
LAnsiArray: array[ 0.. 20] of AnsiChar;
LCharArray: array[ 0.. 20] of Char;
LPAnsiChar: PAnsiChar;
LPChar: PChar;
LAnsiStr: AnsiString;
LStr: string;
begin
mmo1.Lines.Add( ' All->String******** ');
LAnsiArray := ' AnsiChar數組 ';
// 這是拷貝操作,不是指針指向,所以改變數組值對LStr沒影響
LStr := LAnsiArray;
LAnsiArray[ 0] := ' X ';
mmo1.Lines.Add(LStr);
LCharArray := ' WideChar數組 ';
// 這是拷貝操作,不是指針指向,所以改變數組值對LStr沒影響
LStr := LCharArray;
LCharArray[ 0] := ' X ';
mmo1.Lines.Add(LStr);
LPAnsiChar := ' PAnsiChar字符串 ';
LStr := LPAnsiChar;
mmo1.Lines.Add(LStr);
LPChar := ' PChar字符串 ';
// 這是拷貝操作,不是指針指向
LStr := LPChar;
mmo1.Lines.Add(LStr);
LAnsiStr := ' AnsiString字符串 ';
// 這是拷貝操作,不是指針指向
LStr := LAnsiStr;
mmo1.Lines.Add(LStr);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn6Click(Sender: TObject);
var
LAnsiStr: AnsiString;
LStr: string;
begin
mmo1.Lines.Add( ' String->AnsiString******** ');
LStr := ' string字符串 ';
LAnsiStr := AnsiString(LStr);
mmo1.Lines.Add(LAnsiStr);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn7Click(Sender: TObject);
var
LPChar: PChar;
LStr: string;
begin
mmo1.Lines.Add( ' String->PChar******** ');
LStr := ' string字符串 ';
LPChar := PChar(LStr);
mmo1.Lines.Add(LPChar);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn8Click(Sender: TObject);
var
LCharArray: array[ 0.. 20] of Char;
LStr: string;
begin
mmo1.Lines.Add( ' String->Char[] ');
LStr := ' string字符串 ';
StrCopy(LCharArray, PChar(LStr));
mmo1.Lines.Add(LCharArray);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn9Click(Sender: TObject);
var
LCharArray: array[ 0.. 20] of Char;
LPChar: PChar;
begin
mmo1.Lines.Add( ' PChar<->Char[]******** ');
// 將LPChar內容拷貝到LCharArray內存上
LPChar := ' PChar字符串 ';
StrCopy(LCharArray, LPChar);
mmo1.Lines.Add(LCharArray);
// 給PChar分配空間,然后將Char數組數據拷貝到該空間
GetMem(LPChar, 30);
StrCopy(LPChar, @LCharArray[ 0]);
LCharArray[ 0] := ' Z ';
mmo1.Lines.Add(LPChar);
FreeMem(LPChar);
// 將LPChar指針指向了Char數組,所以數組改變會影響PChar
LPChar := LCharArray;
mmo1.Lines.Add(LPChar);
LCharArray[ 0] := ' X ';
mmo1.Lines.Add(LPChar);
mmo1.Lines.Add( '');
end;
procedure TForm1.btn10Click(Sender: TObject);
var
LCharArray: array[ 0.. 20] of Char;
LPChar: PChar;
LStr: string;
begin
LCharArray := ' Char數組 ';
LPChar := LCharArray;
// PChar轉String,做的是拷貝,不是指針指向
LStr := LPChar;
mmo1.Lines.Add( ' Char[]: ' + LCharArray);
mmo1.Lines.Add( ' PChar: ' + LPChar);
mmo1.Lines.Add( ' String: ' + LStr);
// 更改數組的值
LCharArray[ 0] := ' X ';
mmo1.Lines.Add( ' Char[]: ' + LCharArray);
mmo1.Lines.Add( ' PChar: ' + LPChar);
mmo1.Lines.Add( ' String: ' + LStr);
end;
procedure TForm1.btn11Click(Sender: TObject);
var
LPChar: PChar;
LPAnsiChar: PAnsiChar;
begin
mmo1.Lines.Add( ' PChar<->PAnsiChar ');
LPAnsiChar := ' PAnsiChar字符串 ';
LPChar := PChar(String(LPAnsiChar));
mmo1.Lines.Add(LPChar);
LPChar := ' PChar字符串 ';
LPAnsiChar := PAnsiChar(AnsiString(LPChar));
mmo1.Lines.Add(LPAnsiChar);
mmo1.Lines.Add( '');
end;