添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
痴情的单杠  ·  Java Jsch组件研究 | ...·  昨天    · 
博学的瀑布  ·  Java | ThinkingData·  昨天    · 
干练的西红柿  ·  PHP: ...·  8 小时前    · 
叛逆的领结  ·  STRING·  8 小时前    · 
个性的风衣  ·  cURL not found | ...·  7 月前    · 
玩足球的斑马  ·  Space combat & WASD ...·  8 月前    · 
耍酷的自行车  ·  200 OK - HTTP status ...·  1 年前    · 
憨厚的遥控器  ·  Apple 学生折扣 2023 | ...·  1 年前    · 

因为要调用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`类用于处理输出参数。