因为要调用windows的api或者给vc++写接口,很多地方都要用到pchar,现在将char数组、string和pchar之间的相互转换都列出来,都是网上找的资料,我总结一下,先直接上代码,再讲原理。

1.string转换成pchar

可以使用pchar进行强制类型转换,也可以使用StrPCopy函数

var
s:string;
p,p1:PChar;
begin
s:='Hello Delphi';
p:=PChar(s);
ShowMessage(p);
p1:=StrAlloc(Length(s)+);
StrPCopy(p1,s);
ShowMessage(p1);
StrDispose(p1);
end;

2.pchar转换成string

pchar可以直接当string用,也可以用strpas函数转换一下

var
s,s1,s2:string;
p:PChar;
begin
s:='Hello Delphi';
p:=PChar(s);
ShowMessage(p);
s1:=p;
ShowMessage(s1);
s2:=StrPas(p);
ShowMessage(s2);
end;

3.char数组转换成string
   使用StrPas函数获取数组的首地址

var
c:array [..] of Char;
s:string;
begin
c[]:='H';
c[]:='e';
c[]:='l';
c[]:='l';
c[]:='o';
c[]:=' ';
c[]:='D';
c[]:='e';
c[]:='l';
c[]:='p';
c[]:='h';
c[]:='i';
s:=StrPas(@c[]);
ShowMessage(s);
end;

4.string转char数组

使用move或者copymemory函数

var
s:string;
c:array of Char;
i:Integer;
begin
s:='Hello Delphi';
SetLength(c,Length(s));
//Move(s[1],c[0],Length(s));//move和CopyMemory都行
CopyMemory(@c[],PChar(s),Length(s));
for i:=Low(c) to High(c) do
begin
ShowMessage(string(c[i]))
end;
end;

5.char数组转pchar

var
c:array [..] of Char;
p:PChar;
begin
c:='Hello Delphi';
//p:=@c[0];
p:=PChar(@c[]);
ShowMessage(StrPas(p));
end;

6.pchar转char数组

使用move或者CopyMemory函数

var
s:string;
p:PChar;
c:array of Char;
i:Integer;
begin
s:='Hello Delphi';
p:=PChar(s);
SetLength(c,Length(s));
//Move(p^,c[0],Length(s));//move和CopyMemory都行
CopyMemory(@c[],p,Length(s));;
for i:=Low(c) to High(c) do
begin
ShowMessage(string(c[i]))
end;
end;

现在讲讲char数组、pchar和string

string和Char数组都是一块内存,其中存放连续的字符. string保存具体字符的内存对用户是透明的, 由Delphi管理它的分配, 复制和释放, 用户不能干预(其实也可以, 不过是通过非法途径). Char数组就不必说了吧?PChar是一个指针, 它的大小只有32位. 定义时由Delphi自动填0. 要将PChar作为字符串使用的话必须自己分配内存用完必须自己释放. PChar型字符串由#0表示字符串结尾Delphi所提供的相关PChar字符串的操作都是判断#0来决定字符串的结尾的。
因为PChar是指针,所以它能指向任何地方(也就是说它不一定非要指向字符串不可).把一个String赋值给PChar只是将String中保存具体字符串的内存的地址给PChar变量. 当然也可以把Char数组第一个元素的地址给PChar.

至于 哪个占用内存小, Char数组<PChar(指分配过字符串的)<string(除了具体字符串外还包含字符串长度)
如果空字符串那么PChar<String<array [0..n] of Char
从速度来说毫无疑问string最慢, 例如:
作为参数传递(非var调用时)给过程时string将整个字串的副本传递过去, PChar将指针本身的副本传递过去(32位), Char数组和PChar一样, 传递的是第一个元素的地址副本.不过就灵活性来说string最高, 而且Delphi支持的函数最多. 另外可以将String作为Buffer使用(因为它当中可以包含字符0).

注:因为string和char数组都是连续的,所以指向string的首地址的指针为@s[1],指向char数组的首地址的指针为@c[0]。pchar是以#0结尾的,所以很多关于pchar

的函数的使用的时候要注意,如使用StrAlloc函数给pchar分配内存的时候和使用StrPCopy函数的时候

7.使用StrAlloc函数将一个string转换给pchar

var
p:PChar;
s:string;
begin
s:='ABCDEF';
p:=StrAlloc(Length(s));
Move(s[],p^,Length(s));
ShowMessage(StrPas(p));
StrDispose(p);
end;

执行以上代码的时候,字符串后面有乱码,查看delphi帮助里面关于StrAlloc函数

delphi的帮助如下:

StrAlloc allocates a buffer for a null-terminated string with a maximum length ofSize - 1 (1 byte must be reserved for the termination character).

StrAlloc函数给pchar指向的字符串分配的实力内存为size-1个字节,所以我们要多分配一个字节的内存,用来存pchar的结束标志#0

正确使用如下:

var
p:PChar;
s:string;
begin
s:='ABCDEF';
p:=StrAlloc(Length(s)+);
Move(s[],p^,Length(s)+);//将s的内容按照字节复制到p里面
//Move(s[1],p^,Length(s)); //执行这句会出现乱码
ShowMessage(StrPas(p));
StrDispose(p);
end;

8.使用StrPCopy将string转换成char数组

var
s:string;
c:array of Char;
i:Integer;
begin
s:='Hello Delphi';
SetLength(c,Length(s));
StrPCopy(@c[],s);
for i:=Low(c) to High(c) do
begin
ShowMessage(string(c[i]))
end;
end;

以上代码执行的时候会报错,查看delphi帮助才知道,strpcopy函数不做长度检查,需要程序员自己控制。

delphi帮助如下:

StrPCopy copies Source into a null-terminated string Dest. It returns a pointer to Dest.
StrPCopy does not perform any length checking. 
The destination buffer must have room for at least Length(Source)+1 characters

正确代码如下:

var
s:string;
c:array of Char;
i:Integer;
begin
s:='Hello Delphi';
SetLength(c,Length(s)+);
StrPCopy(@c[],s);
for i:=Low(c) to High(c) do
begin
ShowMessage(string(c[i]))
end;
end;

使用strpcopy函数的时候一定要保证目的pchar的长度至少是源字符串的长度+1

delphi char数组、string和Pchar的相互转换的更多相关文章

  1. c++中char*\wchar_t*\string\wstring之间的相互转换

    string U2A(const wstring& str)//Unicode字符转Ascii字符 { string strDes; if ( str.empty() ) goto __end ...

  2. Delphi中的各种字符串、String、PChar、Char数组

    参考博客:http://www.cnblogs.com/pchmonster/archive/2011/12/14/2287686.html 其中的所有代码均在Delphi7下测试通过. Delphi ...

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

    PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组之间的转换关系见下图 通过转换链,可以实现任意两个类型之间的互转.如PChar转PAnsiChar ...

  4. C#字符串与char数组互转!

    字符串转换成Char数组string str="abcdefghijklmnopqretuvwxyz";char[] chars=str.ToCharArray(); char数组 ...

  5. C++ char*,const char*,string,int 的相互转换

    C++ char*,const char*,string,int 的相互转换   1. string转const char* string s ="abc";const char* ...

  6. CHAR数组转成STRING:C++

    有些时候,键入了CHAR数组却不会知道到底有多长,是不是很差评呢?但是,转成STRING就可以啦QWQ #include <iostream> #include <cstdio> ...

  7. char数组和String互转

    char ch[100];string str; 把char*(c类型的string)数组转换为string:str = ch; //即可str.assign(ch); //也可 把string类型转 ...

  8. Java中char和String的相互转换

    转自:http://blog.csdn.net/yaokai_assultmaster/article/details/52082763 Java中char是一个基本类型,而String是一个引用类型 ...

  9. (c++) int 转 string,char*,const char*和string的相互转换

    一.int 和string的相互转换 1 int 转化为 string c++ //char *itoa( int value, char *string,int radix); // 原型说明: / ...

随机推荐

  1. Spark的Rpct模块的学习

    Spark的Rpct模块的学习 Spark的Rpc模块是1.x重构出来可,以前的代码中大量使用了akka的类,为了把akka从项目的依赖中移除,所有添加了该模块.先看下该模块的几个主要的类   使用E ...

  2. OneZero第三周第四次站立会议(2016.4.7)

    1. 时间: 18:35--18:50 共计15分钟. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http: ...

  3. SQL Server 2008中的MERGE(不仅仅是合并)

    SQL Server 2008中的MERGE语句能做很多事情,它的功能是根据源表对目标表执行插入.更新或删除操作.最典型的应用就是进行两个表的同步. 下面通过一个简单示例来演示MERGE语句的使用方法 ...

  4. 论Java的重要性

    最近,最新的世界编程语言排名最近出炉了,Java位居世界第一.          不仅如此,Java以17.856%超过第二名C语言的8.726%两倍以上,其实,这一现象是十分反常的,因为,在前几年, ...

  5. mysql之零碎知识

    一 视图 什么是视图:视图就是一张虚拟表.方便查看. 创建视图:create view 起名 as sql语句 #两张有关系的表 mysql> select * from course; +-- ...

  6. 2018.10.30 NOIP训练 【模板】树链剖分(换根树剖)

    传送门 纯粹是为了熟悉板子. 然后发现自己手生了足足写了差不多25min而且输出的时候因为没开long longWA了三次还不知所云 代码

  7. JSAAS 平台实现 微信类似的TOKEN机制

    在企业微信中,我们在调用微信接口时,我们需要首先获取token,然后根据token,调用API接口方法.这个token是有生命周期的,微信的token默认的生命周期是7200秒. 因此这个token可 ...

  8. (1)There's more to life than being happy

    https://www.ted.com/talks/emily_esfahani_smith_there_s_more_to_life_than_being_happy00:12 I used to ...

  9. 避免使用eval()

    eval()可以将任意的字符串当做一个JavaScript代码来执行. eval()使用实例: // 烦模式 var property = 'name'; console.log(eval('obj. ...

  10. xtrabackup安装使用及原理

    Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具.Xtrabackup中主要包含两个工具 ...