因为要调用windows的api或者给vc++写接口,很多地方都要用到pchar,现在将char数组、string和pchar之间的相互转换都列出来,都是网上找的资料,我总结一下,先直接上代码,再讲原理。
1.string转换成pchar
可以使用pchar进行强制类型转换,也可以使用StrPCopy函数
s:string;
p,p1:PChar;
begin
s:='Hello Delphi';
p:=PChar(s);
ShowMessage(p);
p1:=StrAlloc(Length(s)+1);
StrPCopy(p1,s);
ShowMessage(p1);
StrDispose(p1);
2.pchar转换成string
pchar可以直接当string用,也可以用strpas函数转换一下
s,s1,s2:string;
p:PChar;
begin
s:='Hello Delphi';
p:=PChar(s);
ShowMessage(p);
s1:=p;
ShowMessage(s1);
s2:=StrPas(p);
ShowMessage(s2);
3.char数组转换成string
使用StrPas函数获取数组的首地址
c:array [0..11] of Char;
s:string;
begin
c[0]:='H';
c[1]:='e';
c[2]:='l';
c[3]:='l';
c[4]:='o';
c[5]:=' ';
c[6]:='D';
c[7]:='e';
c[8]:='l';
c[9]:='p';
c[10]:='h';
c[11]:='i';
s:=StrPas(@c[0]);
ShowMessage(s);
4.string转char数组
使用move或者copymemory函数
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[0],PChar(s),Length(s));
for i:=Low(c) to High(c) do
begin
ShowMessage(string(c[i]))
5.char数组转pchar
c:array [0..11] of Char;
p:PChar;
begin
c:='Hello Delphi';
//p:=@c[0];
p:=PChar(@c[0]);
ShowMessage(StrPas(p));
6.pchar转char数组
使用move或者CopyMemory函数
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[0],p,Length(s));;
for i:=Low(c) to High(c) do
begin
ShowMessage(string(c[i]))
现在讲讲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
p:PChar;
s:string;
begin
s:='ABCDEF';
p:=StrAlloc(Length(s));
Move(s[1],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 of
Size - 1
(1 byte must be reserved for the termination character).
StrAlloc函数给pchar指向的字符串分配的实力内存为size-1个字节,
所以我们要多分配一个字节的内存,用来存
pchar的
结束标志#0
正确使用如下:
p:PChar;
s:string;
begin
s:='ABCDEF';
p:=StrAlloc(Length(s)+1);
Move(s[1],p^,Length(s)+1);//将s的内容按照字节复制到p里面
//Move(s[1],p^,Length(s)); //执行这句会出现乱码
ShowMessage(StrPas(p));
StrDispose(p);
end; 8.使用StrPCopy将string转换成char数组
s:string;
c:array of Char;
i:Integer;
begin
s:='Hello Delphi';
SetLength(c,Length(s));
StrPCopy(@c[0],s);
for i:=Low(c) to High(c) do
begin
ShowMessage(string(c[i]))
以上代码执行的时候会报错,查看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
正确代码如下:
s:string;
c:array of Char;
i:Integer;
begin
s:='Hello Delphi';
SetLength(c,Length(s)+1);
StrPCopy(@c[0],s);
for i:=Low(c) to High(c) do
begin
ShowMessage(string(c[i]))
end; 使用strpcopy函数的时候一定要保证目的pchar的长度至少是源字符串的长度+1
因为要调用windows的api或者给vc++写接口,很多地方都要用到pchar,现在将char数组、string和pchar之间的相互转换都列出来,都是网上找的资料,我总结一下。1.string转换成pchar 可以使用pchar进行强制类型转换,也可以使用StrPCopy函数var s:string; p,p1:PChar;begin s:='Hell
PC
har
就是指向一个以Null 结尾的每个字符为一个字节的字符串的指针。 (可以看成是一个字符串)
String
是字符
数组
,以字符#0结尾;
Char
只占一字节的空间,而
Pc
har
保存的是一个指针,在现在32位的系统中占有1个指针字节的大小。
type
PC
har
=^
Char
;
PC
har
类型是一个指向
Char
的指针,并使用
Delphi
的扩展语法.它也能够
delphi
char
数组
、
string
和
Pc
har
的
相互
转换
原创kunlun122 最后发布于2013-10-31 17:42:31 阅读数 18702 收藏
1.
string
转换成
pc
har
可以使用
pc
har
进行强制类型
转换
,也可以使用Str
PC
opy函数
s:
string
;
p,p1:
PC
har
;
begin
s:='Hello
Delphi
';
data()方法
string
str = "hello";
const
char
* p = str.data(); //加const 或者用
char
* p=(
char
*)str.data();的形式
同时有一点需要说明,这里在devc++中编译需要添...
string
str = "good";
const
char
* ch1 = str.c_str(); //
string
--> const
char
*
const
char
* ch2 = str.data(); //
string
--> const
char
*
int len = strlen(ch1); .
```java
public interface MyDll extends Library {
MyDll INSTANCE = Native.load("MyDll", MyDll.class);
void myFunc(Pointer input, PointerByReference output);
2. 在
Delphi
中,将`
PC
har
`类型的参数声明为`PAnsi
Char
`类型。例如:
```
delphi
procedure myFunc(input: PAnsi
Char
; var output: PAnsi
Char
); stdcall;
3. 在Java中,将`
PC
har
`类型的参数
转换
为`Pointer`类型。例如:
```java
String
input
String
= "Hello";
Pointer input = new Memory(input
String
.length() + 1);
input.set
String
(0, input
String
);
PointerByReference output = new PointerByReference();
MyDll.INSTANCE.myFunc(input, output);
String
output
String
= output.getValue().get
String
(0);
其中,`Memory`类用于在JNA中分配内存,`set
String
()`方法用于将Java字符串复制到内存中,`PointerByReference`类用于处理输出参数。