因为要调用windows的api或者给vc++写接口,很多地方都要用到pchar,现在将char数组、string和pchar之间的相互转换都列出来


1.string转换成pchar

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


[delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. string;  
3.   p,p1:PChar;  
4. begin  
5. 'Hello Delphi';  
6.   p:=PChar(s);  
7.   ShowMessage(p);  
8. 1);  
9.   StrPCopy(p1,s);  
10.   ShowMessage(p1);  
11.   StrDispose(p1);  
12. end;  
 
 

 2.pchar转换成string 
 
  pchar可以直接当string用,也可以用strpas函数转换一下
 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. string;  
3.   p:PChar;  
4. begin  
5. 'Hello Delphi';  
6.   p:=PChar(s);  
7.   ShowMessage(p);  
8.   s1:=p;  
9.   ShowMessage(s1);  
10.   s2:=StrPas(p);  
11.   ShowMessage(s2);  
12. end;  
 
 
 3.char数组转换成string 
 
    使用StrPas函数获取数组的首地址 
  
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. array [0..11] of Char;  
3. string;  
4. begin  
5. 0]:='H';  
6. 1]:='e';  
7. 2]:='l';  
8. 3]:='l';  
9. 4]:='o';  
10. 5]:=' ';  
11. 6]:='D';  
12. 7]:='e';  
13. 8]:='l';  
14. 9]:='p';  
15. 10]:='h';  
16. 11]:='i';  
17. 0]);  
18.   ShowMessage(s);  
19. end;  
 
 
4.string转char数组
使用move或者copymemory函数
 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. string;  
3. array of Char;  
4.   i:Integer;  
5. begin  
6. 'Hello Delphi';  
7.   SetLength(c,Length(s));  
8. //Move(s[1],c[0],Length(s));//move和CopyMemory都行  
9. 0],PChar(s),Length(s));  
10. for i:=Low(c) to High(c) do  
11. begin  
12. string(c[i]))  
13. end;  
14. end;  
 
 
5.char数组转pchar
 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. array [0..11] of Char;  
3.   p:PChar;  
4. begin  
5. 'Hello Delphi';  
6. //p:=@c[0];  
7. 0]);  
8.   ShowMessage(StrPas(p));  
9. end;  
 
 
 6.pchar转char数组 
 
使用move或者CopyMemory函数
 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. string;  
3.   p:PChar;  
4. array of Char;  
5.   i:Integer;  
6. begin  
7. 'Hello Delphi';  
8.   p:=PChar(s);  
9.   SetLength(c,Length(s));  
10. //Move(p^,c[0],Length(s));//move和CopyMemory都行  
11. 0],p,Length(s));;  
12. for i:=Low(c) to High(c) do  
13. begin  
14. string(c[i]))  
15. end;  
16. 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

 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2.   p:PChar;  
3. string;  
4. begin  
5. 'ABCDEF';  
6.   p:=StrAlloc(Length(s));  
7. 1],p^,Length(s));  
8.   ShowMessage(StrPas(p));  
9.   StrDispose(p);  
10. 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 
 
正确使用如下:
 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2.   p:PChar;  
3. string;  
4. begin  
5. 'ABCDEF';  
6. 1);  
7. 1],p^,Length(s)+1);//将s的内容按照字节复制到p里面  
8. //Move(s[1],p^,Length(s)); //执行这句会出现乱码  
9.   ShowMessage(StrPas(p));  
10.   StrDispose(p);  
11. end;  
 8.使用StrPCopy将string转换成char数组 
  
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. string;  
3. array of Char;  
4.   i:Integer;  
5. begin  
6. 'Hello Delphi';  
7.   SetLength(c,Length(s));  
8. 0],s);  
9. for i:=Low(c) to High(c) do  
10. begin  
11. string(c[i]))  
12. end;  
13. 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正确代码如下:

 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. string;  
3. array of Char;  
4.   i:Integer;  
5. begin  
6. 'Hello Delphi';  
7. 1);  
8. 0],s);  
9. for i:=Low(c) to High(c) do  
10. begin  
11. string(c[i]))  
12. end;  
13. end;  
 使用strpcopy函数的时候一定要保证目的pchar的长度至少是源字符串的长度+1 
 

 
 
  
  
  
  
  
  

 

         
 

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

1.string转换成pchar
   可以使用pchar进行强制类型转换,也可以使用StrPCopy函数
 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. string;  
3.   p,p1:PChar;  
4. begin  
5. 'Hello Delphi';  
6.   p:=PChar(s);  
7.   ShowMessage(p);  
8. 1);  
9.   StrPCopy(p1,s);  
10.   ShowMessage(p1);  
11.   StrDispose(p1);  
12. end;  
 
 

 2.pchar转换成string 
 
  pchar可以直接当string用,也可以用strpas函数转换一下
 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. string;  
3.   p:PChar;  
4. begin  
5. 'Hello Delphi';  
6.   p:=PChar(s);  
7.   ShowMessage(p);  
8.   s1:=p;  
9.   ShowMessage(s1);  
10.   s2:=StrPas(p);  
11.   ShowMessage(s2);  
12. end;  
 
 
 3.char数组转换成string 
 
    使用StrPas函数获取数组的首地址 
  
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. array [0..11] of Char;  
3. string;  
4. begin  
5. 0]:='H';  
6. 1]:='e';  
7. 2]:='l';  
8. 3]:='l';  
9. 4]:='o';  
10. 5]:=' ';  
11. 6]:='D';  
12. 7]:='e';  
13. 8]:='l';  
14. 9]:='p';  
15. 10]:='h';  
16. 11]:='i';  
17. 0]);  
18.   ShowMessage(s);  
19. end;  
 
 
4.string转char数组
使用move或者copymemory函数
 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. string;  
3. array of Char;  
4.   i:Integer;  
5. begin  
6. 'Hello Delphi';  
7.   SetLength(c,Length(s));  
8. //Move(s[1],c[0],Length(s));//move和CopyMemory都行  
9. 0],PChar(s),Length(s));  
10. for i:=Low(c) to High(c) do  
11. begin  
12. string(c[i]))  
13. end;  
14. end;  
 
 
5.char数组转pchar
 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. array [0..11] of Char;  
3.   p:PChar;  
4. begin  
5. 'Hello Delphi';  
6. //p:=@c[0];  
7. 0]);  
8.   ShowMessage(StrPas(p));  
9. end;  
 
 
 6.pchar转char数组 
 
使用move或者CopyMemory函数
 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. string;  
3.   p:PChar;  
4. array of Char;  
5.   i:Integer;  
6. begin  
7. 'Hello Delphi';  
8.   p:=PChar(s);  
9.   SetLength(c,Length(s));  
10. //Move(p^,c[0],Length(s));//move和CopyMemory都行  
11. 0],p,Length(s));;  
12. for i:=Low(c) to High(c) do  
13. begin  
14. string(c[i]))  
15. end;  
16. 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

 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2.   p:PChar;  
3. string;  
4. begin  
5. 'ABCDEF';  
6.   p:=StrAlloc(Length(s));  
7. 1],p^,Length(s));  
8.   ShowMessage(StrPas(p));  
9.   StrDispose(p);  
10. 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 
 
正确使用如下:
 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2.   p:PChar;  
3. string;  
4. begin  
5. 'ABCDEF';  
6. 1);  
7. 1],p^,Length(s)+1);//将s的内容按照字节复制到p里面  
8. //Move(s[1],p^,Length(s)); //执行这句会出现乱码  
9.   ShowMessage(StrPas(p));  
10.   StrDispose(p);  
11. end;  
 8.使用StrPCopy将string转换成char数组 
  
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. string;  
3. array of Char;  
4.   i:Integer;  
5. begin  
6. 'Hello Delphi';  
7.   SetLength(c,Length(s));  
8. 0],s);  
9. for i:=Low(c) to High(c) do  
10. begin  
11. string(c[i]))  
12. end;  
13. 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正确代码如下:

 
 
 
    [delphi]  
    view plain 
     copy 
    
 
    
 
  
1. var  
2. string;  
3. array of Char;  
4.   i:Integer;  
5. begin  
6. 'Hello Delphi';  
7. 1);  
8. 0],s);  
9. for i:=Low(c) to High(c) do  
10. begin  
11. string(c[i]))  
12. end;  
13. end;

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