请教PChar和String类型的区别和联系 ( 积分: 50 )

  • 主题发起人 主题发起人 MayRoy
  • 开始时间 开始时间
M

MayRoy

Unregistered / Unconfirmed
GUEST, unregistred user!
前些时候写程序,把一个Label的Caption当作String直接加上下标去相应位置的字符,但是却报错,说不兼容,请问Delphi中的字符串类型有什么不同啊。
谢谢各位大侠!
 
前些时候写程序,把一个Label的Caption当作String直接加上下标去相应位置的字符,但是却报错,说不兼容,请问Delphi中的字符串类型有什么不同啊。
谢谢各位大侠!
 
晕,label的caption本来就是string类型的

pchar相当于char *,是0终止字符串,string是pascal特有的,两者可以互相转换(直接用类型转换就可以了)。
 
Label 为String
PChar为'字符'=#0
二者可以互换
eg:
var
str:String;
p:PChar;
procedure ConvertStrToPchar;
beging
p:=PChar(Str);
end;
 
建议先搜索一下离线论坛!
 
先解释你的疑惑:一个字符串(String类型的)变量是可以通过脚标的方式访问指定位置的字符的,但是 Label 的 Caption 是一个属性而不是一个简单的字符串变量,因此你不能像使用字符串变量一样简单地加上脚标来访问指定字符,这是语法Delphi上规定的。

再来解释你的问题:单纯的PChar类型是一个指向字符的指针(注意是指向字符而不是指向字符串),就像PInteger是一个指向整型数的指针一样。
为什么很多时候都用一个PChar类型的变量来表示指向一个字符串的指针呢?因为字符串中的字符是一个挨着一个被保存到内存中的,当你知道了第一个字符的位置的时候,你就可以通过这个位置加 1 来获得下一个字符的位置,因此经常用一个PChar表示一个字符串,其实PChar变量保存的仅仅是这个字符串第一个字符的地址而已。
再说String类型,String类型是Delphi特有的一个数据类型,简单讲,可以把他认为是一个以0结尾的字符串,你定义了一个String类型的数据,实际上也是定义了一个指针,这个指针很特殊,其指针的负偏移位置也是有内容的,分别记录这这个字符串的使用次数和长度,其正偏移部分记录的就是这个字符串。因此,String类型的数据是引用记数的,当引用次数为0的时候,系统就会释放这个字符串所占用的内存。这点上,和PChar是不一样的。
之所以上面的朋友说String可以转换成PChar,是因为String的正偏移部分和一个PChar所表示的字符串的结构是一致的。
 
还真有学问
 
我记得这个字符串类型有个与其他语言兼容的问题,是哪个类型与其他类型兼容啊,另外的是不兼容的。
 
s:='String';
for i:=1 to Length(s) do
s;
字符串可以看成一个从1开始的Array of char
s[0]是字符串的长度
Pchar是指针
是Array of Char
的首地址
 
to 放飞,

其实delphi默认的string是一个指针,不过string有几种不同实现方式,shortstring就不是一个指针(准确说,是几种不同的string),shortstring相当于turbo pascal的string。

string类型并不是零终止字符串,特别是它可以中间加入#0,因为string类型除了保存字符串内容之外,还保存了长度等信息,而且这是通过增加附加字段来实现的。pchar则一般是零终止字符串。

turbo pascal经典的string同样也是,不过它是固定长度的,最长是255字节,实际上第一个字节是length,所以实际占用的是256字节。

pchar类型和string类型的变量可以互相转换,只需用普通的类型转换就行了。

另外,string的下标开始是1,如果用pchar,由于是指针,所以只能0开始,因为它是首址+偏移这样来计算的。
 
虽然string默认是指针,不过在赋值或改变其值的时候不用当它是个指针,因为当你改变它的值的时候,若同一段string有多个引用,则改变的时候会拷贝一份新的,然后在新的上面改变,这样几个string变量的内容就不会同时改变,这叫copy on write
 
所以在DLL都转换为PChar,对不
 
stlxv
我说的String是专指String类型,也就是生存期自管理的那个String
Delphi中的短字符串,是一个通用的数据类型,可以在DLL之间或者是不同的编程语言之间传递字符串。
Delphi中的String,最好不要在DLL之间或者在不同编程语言之间传递,因为这个字符串是引用记数的,一旦引用记数为0,那么就会被自动释放。用PChar强制转换一个String,也不要在DLL之间使用。
 
多人接受答案了。
 
后退
顶部