PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组转换
Posted on 2016-04-14 20:56 sgao 阅读(3169) 评论(0) 编辑 收藏 举报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;