码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-04-14 22:11:44      阅读:336      评论:0      收藏: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;

 

技术分享

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

标签:

原文地址:http://www.cnblogs.com/igaoshang/p/StringConvert.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!