delphi char数组、string和Pchar的相互转换
<p>因为要调用windows的api或者给vc++写接口,很多地方都要用到pchar,现在将char数组、string和pchar之间的相互转换都列出来,都是网上找的资料,我总结一下,先直接上代码,再讲原理。</p><p> </p>
<p>1.string转换成pchar</p>
<p> 可以使用pchar进行强制类型转换,也可以使用StrPCopy函数</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
s:</span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
p,p1:PChar;
begin
s:</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Hello Delphi</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
p:</span>=<span style="color: rgba(0, 0, 0, 1)">PChar(s);
ShowMessage(p);
p1:</span>=StrAlloc(Length(s)+<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
StrPCopy(p1,s);
ShowMessage(p1);
StrDispose(p1);
end;</span></pre>
</div>
<p> </p>
<p><br>2.pchar转换成string<br> pchar可以直接当string用,也可以用strpas函数转换一下</p>
<p>var<br>s,s1,s2:string;<br>p:PChar;<br>begin<br>s:='Hello Delphi';<br>p:=PChar(s);<br>ShowMessage(p);<br>s1:=p;<br>ShowMessage(s1);<br>s2:=StrPas(p);<br>ShowMessage(s2);<br>end;</p>
<p>3.char数组转换成string<br> 使用StrPas函数获取数组的首地址<br>var<br>c:array of Char;<br>s:string;<br>begin<br>c:='H';<br>c:='e';<br>c:='l';<br>c:='l';<br>c:='o';<br>c:=' ';<br>c:='D';<br>c:='e';<br>c:='l';<br>c:='p';<br>c:='h';<br>c:='i';<br>s:=StrPas(@c);<br>ShowMessage(s);<br>end;<br>4.string转char数组</p>
<p>使用move或者copymemory函数</p>
<p>var<br>s:string;<br>c:array of Char;<br>i:Integer;<br>begin<br>s:='Hello Delphi';<br>SetLength(c,Length(s));<br>//Move(s,c,Length(s));//move和CopyMemory都行<br>CopyMemory(@c,PChar(s),Length(s));<br>for i:=Low(c) to High(c) do<br>begin<br> ShowMessage(string(c))<br>end;<br>end;</p>
<p>5.char数组转pchar</p>
<p>var<br>c:array of Char;<br>p:PChar;<br>begin<br>c:='Hello Delphi';<br>//p:=@c;<br>p:=PChar(@c);<br>ShowMessage(StrPas(p));<br>end;</p>
<p>6.pchar转char数组<br>使用move或者CopyMemory函数</p>
<p>var<br>s:string;<br>p:PChar;<br>c:array of Char;<br>i:Integer;<br>begin<br>s:='Hello Delphi';<br>p:=PChar(s);<br>SetLength(c,Length(s));<br>//Move(p^,c,Length(s));//move和CopyMemory都行<br>CopyMemory(@c,p,Length(s));;<br>for i:=Low(c) to High(c) do<br>begin<br> ShowMessage(string(c))<br>end;<br>end;</p>
<p><br>现在讲讲char数组、pchar和string</p>
<p>string和Char数组都是一块内存,其中存放连续的字符. string保存具体字符的内存对用户是透明的, 由Delphi管理它的分配, 复制和释放, 用户不能干预(其实也可以, 不过是通过非法途径). Char数组就不必说了吧?PChar是一个指针, 它的大小只有32位. 定义时由Delphi自动填0. 要将PChar作为字符串使用的话必须自己分配内存用完必须自己释放. PChar型字符串由#0表示字符串结尾Delphi所提供的相关PChar字符串的操作都是判断#0来决定字符串的结尾的。<br>因为PChar是指针,所以它能指向任何地方(也就是说它不一定非要指向字符串不可).把一个String赋值给PChar只是将String中保存具体字符串的内存的地址给PChar变量. 当然也可以把Char数组第一个元素的地址给PChar.</p>
<p><br>至于 哪个占用内存小, Char数组<PChar(指分配过字符串的)<string(除了具体字符串外还包含字符串长度)<br>如果空字符串那么PChar<String<array of Char<br>从速度来说毫无疑问string最慢, 例如:<br>作为参数传递(非var调用时)给过程时string将整个字串的副本传递过去, PChar将指针本身的副本传递过去(32位), Char数组和PChar一样, 传递的是第一个元素的地址副本.不过就灵活性来说string最高, 而且Delphi支持的函数最多. 另外可以将String作为Buffer使用(因为它当中可以包含字符0).</p>
<p>注:因为string和char数组都是连续的,所以指向string的首地址的指针为@s,指向char数组的首地址的指针为@c。pchar是以#0结尾的,所以很多关于pchar</p>
<p>的函数的使用的时候要注意,如使用StrAlloc函数给pchar分配内存的时候和使用StrPCopy函数的时候</p>
<p>7.使用StrAlloc函数将一个string转换给pchar</p>
<p><br>var<br>p:PChar;<br>s:string;<br>begin<br>s:='ABCDEF';<br>p:=StrAlloc(Length(s));<br>Move(s,p^,Length(s));<br>ShowMessage(StrPas(p));<br>StrDispose(p);<br>end;<br>执行以上代码的时候,字符串后面有乱码,查看delphi帮助里面关于StrAlloc函数</p>
<p>delphi的帮助如下:</p>
<p>StrAlloc allocates a buffer for a null-terminated string with a maximum length ofSize - 1 (1 byte must be reserved for the termination character). </p>
<p>StrAlloc函数给pchar指向的字符串分配的实力内存为size-1个字节,所以我们要多分配一个字节的内存,用来存pchar的结束标志#0<br>正确使用如下:</p>
<p>var<br>p:PChar;<br>s:string;<br>begin<br>s:='ABCDEF';<br>p:=StrAlloc(Length(s)+1);<br>Move(s,p^,Length(s)+1);//将s的内容按照字节复制到p里面<br>//Move(s,p^,Length(s)); //执行这句会出现乱码<br>ShowMessage(StrPas(p));<br>StrDispose(p);<br>end;<br>8.使用StrPCopy将string转换成char数组<br>var<br>s:string;<br>c:array of Char;<br>i:Integer;<br>begin<br>s:='Hello Delphi';<br>SetLength(c,Length(s));<br>StrPCopy(@c,s);<br>for i:=Low(c) to High(c) do<br>begin<br> ShowMessage(string(c))<br>end;<br>end;</p>
<p>以上代码执行的时候会报错,查看delphi帮助才知道,strpcopy函数不做长度检查,需要程序员自己控制。<br>delphi帮助如下:</p>
<p>StrPCopy copies Source into a null-terminated string Dest. It returns a pointer to Dest.<br>StrPCopy does not perform any length checking. <br>The destination buffer must have room for at least Length(Source)+1 characters</p>
<p>正确代码如下:</p>
<p><br>var<br>s:string;<br>c:array of Char;<br>i:Integer;<br>begin<br>s:='Hello Delphi';<br>SetLength(c,Length(s)+1);<br>StrPCopy(@c,s);<br>for i:=Low(c) to High(c) do<br>begin<br> ShowMessage(string(c))<br>end;<br>end;<br>使用strpcopy函数的时候一定要保证目的pchar的长度至少是源字符串的长度+1<br>--------------------- <br>版权声明:本文为CSDN博主「kunlun122」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。<br>原文链接:https://blog.csdn.net/kunlun122/article/details/13773075</p><br><br>
来源:https://www.cnblogs.com/tc310/p/11353543.html
頁:
[1]