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


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;

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM