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