提问:msg: array[0..0] of char;如果是用来定义动态字符串的话,它和string有什么区别,或者说有什么优势么(10分)

  • 主题发起人 主题发起人 xiezhy
  • 开始时间 开始时间
X

xiezhy

Unregistered / Unconfirmed
GUEST, unregistred user!
提问:msg: array[0..0] of char;如果是用来定义动态字符串的话,它和string有什么区别,或者说有什么优势么?
 
Another_eYes (2000-09-20 1:17:00)
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-09-20 1:43:00)
在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来设定它的长度。
 
不好意思,没说清楚,主要是[0..0]问题
 
你要动态分配的话,应该这样写msg: array of char;
区别和优势,上面的文字里已经写得很清楚了。
 
请看Delphi自带的例子程序:Ipcdemos中的
TTraceEntry = record
Size: Integer;
Time: Integer;
Msg: array[0..0] of Char;
end;
定义,我比较奇怪他为什么会这样定义Msg,有什么用途么?
谢谢!
 
哪位高手帮忙看看,谢了!抑郁中。。。
 
看了一下,它就是一个一位的char,
具体他为啥要那么写。。。这个就说不清楚了。。。
也许考虑以后扩展时比较方便?猜想的,呵呵
 
这个是DELPHI比较老版本(好象是4.0前的)的定义,我当时碰到也很是吃惊
 
开发编译器的人也懒,一直沿用至今
 
楼上的说法我也同意,这个demo是98年写的,难免有点。。。
delphi1、delphi2那时自带的部分代码常量的值是可变的,
在现在来说有点费解,也就是当时的编译环境不同造成的,
现在的delphi自己的代码和原先的已经不同了。。。
 
我是说DELPHI 7里都还有这样定义的,当时我好象是在关于图象处理的某些单元里见到,然后查了相关资料才发现是开发编译器的人太懒造成的缘故,因为不影响什么,他们一直没改
 
delphi这样定义是来源于windows的API,有很多API是这样定义的,由于在C语言中数组其实就是指针,所以这样定义。但在delphi必须使用PByte(@msg)的方法访问大于1的成员。至于你说的于String中的差别在这里没有可比性,而且楼上的已经说的很清楚了,我就不复述了。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
606
import
I
后退
顶部