关于Pchar类型,有点头晕。(20分)

  • 主题发起人 主题发起人 loskiller
  • 开始时间 开始时间
L

loskiller

Unregistered / Unconfirmed
GUEST, unregistred user!
Var<br>&nbsp; p:Pchar<br>如果这样声明p代表的是这个字符串的地址<br>var<br>&nbsp; p:array of Pchar;<br>如果这样声明p代表的是这个字符串数组的地址<br>但是这样声明是p代表什么呢<br>type<br>&nbsp; Ps=array of Pchar;<br>&nbsp; PPs=^Ps;<br>var<br>&nbsp; p:PPs;<br>
 
还有第二种和第三种有什么区别,这两种情况应该在什么情况下用
 
第三种的 P^[1] = 第二种的 p[1]
 
1.p是一个以0结尾的字符串<br>2.p是一个动态数组,成员是第1个p<br>3.p是一个指针,指向是第2个p
 
ps声明为array of Pchar,即数组的Pchar(字符指针)<br>PPs=^Ps, 它继承了ps指针,PPs被当作一个继承的类成员来使用。<br>p:PPs; &nbsp;声明一个变量, 类型为PPs
 
------------------------------------------------------------------------<br>string和Char数组都是一块内存, 其中存放连续的字符. string保存具体字符的内存对用户 <br>是透明的, 由Delphi管理它的分配, 复制和释放, 用户不能干预(其实也可以, 不过是通过 <br>非法途径). Char数组就不必说了吧? <br>PChar是一个指针, 它的大小只有32位. 定义时由Delphi自动填0. 要将PChar作为字符串 <br>使用的话必须自己分配内存用完必须自己释放. PChar型字符串由#0表示字符串结尾 <br>Delphi所提供的相关PChar字符串的操作都是判断#0来决定字符串的结尾的。 <br>因为PChar是指针,所以它能指向任何地方(也就是说它不一定非要指向字符串不可). <br>把一个String赋值给PChar只是将String中保存具体字符串的内存的地址给PChar <br>变量. 当然也可以把Char数组第一个元素的地址给PChar. <br>至于 哪个占用内存小, Char数组<PChar(指分配过字符串的)<string(除了具体字符串外 <br>还 包含字符串长度) <br>如果空字符串那么PChar<String<array [0..n] of Char <br>从速度来说毫无疑问string最慢, 例如: <br>作为参数传递(非var调用时)给过程时string将整个字串的副本传递过去, PChar将指针 <br>本身的副本传递过去(32位), Char数组和PChar一样, 传递的是第一个元素的地址副本. <br>不过就灵活性来说string最高, 而且Delphi支持的函数最多. 另外可以将String作为 <br>Buffer使用(因为它当中可以包含字符0). <br>&nbsp;<br>amo (2000-9-20 1:35:26) &nbsp;<br>----------------------------------------------------------------------------------<br>在Delphi2.0以后的版本中, <br>string分两种, <br>&nbsp; 一种是与Pascal传统string相兼容,叫ShortString, <br>&nbsp; 它的存储结构如下: <br>&nbsp; &nbsp;+---------------------+ &nbsp; &nbsp;<br>&nbsp; &nbsp;| 1Byte | &nbsp;字符串内容 | <br>&nbsp; &nbsp;+---------------------+ <br>&nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; 1 ...... <br>&nbsp; &nbsp; 其中第一个字节为字符串的长度。 <br>&nbsp; &nbsp; 所以ShortString所能包括的字符串长度不能大于255。 <br>&nbsp; 另一种是叫长字符串AnsiString, &nbsp;它就是一个指向字符串的指针,不过具体的存储有些特别。 <br>&nbsp; 它的存储结构如下: <br>&nbsp; +-----------------------+ <br>&nbsp; | 4B | 4B | &nbsp;字符串内容 | <br>&nbsp; +-----------------------+ <br>&nbsp; -8 &nbsp; -4 &nbsp; 0 &nbsp;...... <br>&nbsp; 其中,AnsiString指向字符串第一个字符, <br>&nbsp; &nbsp; &nbsp; &nbsp; 在第一个字符的反方向第1到第4的4个字节表示字符串长度,第5到第8的4个字节表字符串被引用的次数。 <br><br>pchar就是纯指向字符串(#0字符结尾)的指针,与C语言中的char *是一样的。 <br><br>char数组也是指向字符串的指针,它与pchar的区别在于: <br>&nbsp; &nbsp; 1.char数组(均指非动态数组)一旦定义好,它的长度就固定了; <br>&nbsp; &nbsp; 2.char数组的地址是常量,不能另赋其它值,不能象pchar一样, <br>&nbsp; &nbsp; &nbsp; &nbsp;如: sPchar:pchar; sArray1,sArray2:array[0..80]of char; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sPChar:=sArray2; sPChar;=sArray1; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;但不能sArray2:=sArray1; <br>&nbsp; &nbsp;char数组就相当于const char * &nbsp;<br><br>要说速度最快当然是纯指针操作的pchar与char数组最快啦 <br>所谓占内存最少,效率更高, <br>不知老兄你想进行什么方面的应用, <br>一般对string,pchar或char数组,不用考虑这些。 <br><br>对编程而言,如果在Delphi或C++Builder中使用,可尽量使用AnsiString, <br>Borland公司对它已经进行了非常完美的内部处理, <br>使用非常方便。 <br>如果涉及到Windows API或混合编程等,接口部分一般使用pchar。 <br><br>char数组使用的比较少了,因为多数可以用char数组的地方, <br>现在比较流行的作法是定义一个ansistring, 再用setlength来设定它的长度。 <br>&nbsp;<br><br><br>lycwg (2001-1-12 11:53:20) &nbsp;<br>------------------------------------------------------------<br>三、字符串string 字符数组与指向字 <br>  符串的指针pchar的区别与联系 <br>  这3者的基本概念相同,但有一些非常细微的差别,在编程时稍不注意就会出错,需高度重视。 <br>  1、使用指向字符串的指针,如果不是以0结尾,运行时就会出现错误。为了避免这种错误,需要在字符串结尾人工加入0 即char(0),或用strpcopy函数在字符串结尾自动加0。 <br>  例1: 指向字符串的指针,如果不是以0结尾,运行时会出现错误: <br>  {s[0]=3 s[1]='n' s[2]='e' s[3]='w'} <br>  var <br>&nbsp; &nbsp;  s:string; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;p:pchar; <br>  begin <br>&nbsp; &nbsp;  s:='new'; &nbsp;<br>&nbsp; &nbsp; &nbsp;  label1.caption:=s; {new} <br>&nbsp; &nbsp; &nbsp;  label2.caption:=intTostr(integer(s[0]));{3是字符串的长度} <br>&nbsp; &nbsp;  p:=@s[1];{不是以0结尾,莫用pchar型指针} <br>   &nbsp; label3.caption:=strpas(p); {运行时出现错误} <br>  end; <br><br>  例2:在字符串结尾人工加入0即char(0),可使用指向字符串的指针。 <br>  {s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;} <br>  {p--&amp;gt;'new'} <br>  var &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; s:string; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p:pchar; <br>  begin <br>&nbsp; &nbsp;  p:=@s[1]; <br>&nbsp; &nbsp;  s:='new'+char(0); {以0结尾,可用pchar型指针} <br>&nbsp; &nbsp;  label1.caption:=strpas(p); {new} <br>
 
很詳細,謝zurich兄了...
 
多人接受答案了。
 
前一种P声明表示是数组的指针,而后面一种PPs则是数组指针的指针
 

Similar threads

回复
0
查看
867
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
后退
顶部