GS

被sgao忘记的东西都在这里。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组转换

Posted on 2016-04-14 20:56  sgao  阅读(3077)  评论(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..20of AnsiChar;
  LCharArray: array[0..20of 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..20of 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..20of AnsiChar;
  LCharArray: array[0..20of 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..20of 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..20of 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..20of 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;