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..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;

时间: 2024-08-02 06:57:39

PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组转换的相关文章

Delphi中的PChar、String、Char数组

参考:http://blog.csdn.net/procedure1984/article/details/5419616 一.三者的区别 string和char数组都是一块内存,其中存放着连续的字符. string保存具体字符的内存对用户是透明的,有Delphi管理它的分配.复制和释放,用户不能干预(其实也可以,不过是通过非法途径) Char数组类似于C/C++中的字符数组 PChar是一个指针,它的大小只有32位.定义时由Delphi自动填0.要将PChar作为字符串使用的话,必须自己分配内

int 与 String 与 char 之间的互相转换

int 转 String: 1 //方式一: 2 int i1 = 888; 3 String s1 = Integer.toString(i1); 4 5 //方式二: 6 int i2 = 888; 7 String s2 = String.valueOf(i2); 8 9 //方式三: 10 int i3 = 888; 11 String s3 = i3+""; String 转 int : 1 //方式一: 2 String s = "888"; 3 int

[转载] Delphi 的字符及字符串[2] - Char、AnsiChar、WideChar、PChar、PAnsiChar、PWideChar

//单字符 Char.AnsiChar (在目前版本(2007)中, 它们是一回事, 只有 1 字节大小) var   c: Char; {Char 类型的取值范围是: #0..#255, 用十六进制表示是: #$0..#$FF} begin   {用十进制方式赋值:}   c := #65;   ShowMessage(c); {A}   {用十六进制方式赋值:}   c := #$41;   ShowMessage(c); {A}   {用 Chr 函数代替 # 符号}   c := Chr

C/C++ string和char数组对比

string是c++特有的,使用时需添加头文件#include<string> (一)#include<string.h>和#include<cstring>以及#include<string.h>区别 <string.h> <string.h>是C版本的头文件,包含比如strcpy.strcat之类的字符串处理函数. <cstring> 在C++标准化(1998年)过程中,为了兼容以前,标准化组织将所有这些文件都进行了新

string:本质是char类型的数组

一个字符串,可以看作是多个char组成的数组,本质就是char类型数组. 字符串是 Unicode 字符的有序集合,用于表示文本.所以String 对象是 Char 对象的有序集合,用于表示字符串.String 对象的值是该有序集合的内容,并且该值是不可变的.字符串本质是字符数组--这是一个非常重要的概念,了解这个概念就可以全面的理解和把握字符串的各种特征. 由于字符串是字符数组,因此字符串可以直接当数组使用,通过下标的模式访问字符串中的每一个字符,或者可以将字符串转为字符数组. static

JavaSE8基础 String 将char数组的一部分转为String

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        code: package jizuiku.t01; public class Demo1 { public static void main(String[] args) { char[] c = { 'a', 'b', 'c', 'd', 'e', 'f' }; int startIndex = 1;// 从c[

Delphi字符串、PChar与字符数组之间的转换

来自:http://my.oschina.net/kavensu/blog/193719 ----------------------------------------------------------------- var s: string; p: pchar; a: array[1..20] of char; 1.字符串 ---> PChar p := PChar(s); 2.PChar ---> 字符串 s := p; 3.PChar ---> 字符数组 StrCopy(@a

将一个字符串看作一个char类型的数组

有时候我们会遇到将用户输入的一句话中的某一个字符拿出来用的问题. 我们可以将用户输入的字符串看作一个char类型的数组 比如有一个字符串string a = "hello"; 要将'e'输出怎么办? 我们将a看作一个char类型的数组,然后使用for循环来遍历这个数组,然后在控制台中输出即可 for(int i = 0;i<a.Length;i++) { Console.writeLine(a[1]); } 关键是要有将字符串看作char类型数组的思维. 小菜鸟今天的一点小心得,

String 字符串的追加,数组拷贝

package chengbaoDemo; import java.util.Arrays; /** *需求:数组的扩容以及数据的拷贝 *分析:因为String的实质是以字符数组存储的,所以字符串的追加,<br> *实质上是数组的扩容,数据的移动(复制) * */ public class TestString { public static void main(String[] args) { String src = new String("src"); String