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;