首页  编辑  

string,pchar,char数组的详细区别

Tags: /超级猛料/Language.Object Pascal/指针、内存相关/   Date Created:

string,pchar,char数组的详细区别

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).

amo (2000-9-20 1:43)

在Delphi2.0以后的版本中,

string分两种,

 一种是与Pascal传统string相兼容,叫ShortString,

 它的存储结构如下:

  +---------------------+  

  | 1Byte |  字符串内容 |

  +---------------------+

  0       1 ......

   其中第一个字节为字符串的长度。

   所以ShortString所能包括的字符串长度不能大于255。

 另一种是叫长字符串AnsiString,  它就是一个指向字符串的指针,不过具体的存储有些特别。

 它的存储结构如下:

 +-----------------------+

 | 4B | 4B |  字符串内容 |

 +-----------------------+

 -8   -4   0  ......

 其中,AnsiString指向字符串第一个字符,

       在第一个字符的反方向第1到第4的4个字节表示字符串长度,第5到第8的4个字节表字符串被引用的次数。

pchar就是纯指向字符串(#0字符结尾)的指针,与C语言中的char *是一样的。

char数组也是指向字符串的指针,它与pchar的区别在于:

   1.char数组(均指非动态数组)一旦定义好,它的长度就固定了;

   2.char数组的地址是常量,不能另赋其它值,不能象pchar一样,

      如: sPchar:pchar; sArray1,sArray2:array[0..80]of char;

        sPChar:=sArray2; sPChar;=sArray1;

        但不能sArray2:=sArray1;

  char数组就相当于const char *

要说速度最快当然是纯指针操作的pchar与char数组最快啦

所谓占内存最少,效率更高,

不知老兄你想进行什么方面的应用,

一般对string,pchar或char数组,不用考虑这些。

对编程而言,如果在Delphi或C++Builder中使用,可尽量使用AnsiString,

Borland公司对它已经进行了非常完美的内部处理,

使用非常方便。

如果涉及到Windows API或混合编程等,接口部分一般使用pchar。

char数组使用的比较少了,因为多数可以用char数组的地方,

现在比较流行的作法是定义一个ansistring, 再用setlength来设定它的长度。