请问一个关于字符串的概念问题(0分)

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
AnsiString字符串是以NULL结束的,那么是否直接可以将AnsiString字符串(也就是String
类型的字符串)直接赋给PChar类型的变量吗?
 
var
s: string;
c: pchar;
begin
s := 'hello, world';
c := pchar(s);
end;
 
"AnsiString字符串是以NULL结束的",
不是吧?

String一般指的就是AnsiString,区别于WideString
 
楼上大侠,我是看"delphi5.0开发人员指南'上面讲的.
有一点想不通,既然ansistring是以NULL结束的,为什么在API函数调用该类型的字符串时,
要用PCHAR()进行转换?PChar()也是将字符串转换成NULl结束的字符指针。
 
ansistring就是string

不一定是NULL结尾的,他本身就包含了自身的长度信息
确切地说ansistring是不依靠NULL作为结束符的,而PChar则是以NULL为结束符的
因此需要转化
 
"delphi5.0开发人员指南'上面讲到"AnsiString字符串总是null结束的.因此,它能跟以
null结尾的字符串兼容"
 
有可能是以NULL结束的!
不能将STRING类型赋给PCHAR会不会是DELPHI编译时类型检查通不过??
 
是因为它们在内存中的格式不对,是这样吗?
AnsiString(也就是String)和Pchar类型都是以null结束的类型,但内存中的格式不对.
 
ansistring 可以在中间包含NULL,这样能和Pchar兼容吗?呵呵

ansistring的内存存储方式是这样的,
4个字节的引用计数+4个字节的字符串长度+字符串的内容(一个字节一个ascii字符)
我们正常途径只能从字符串内容开始,比如变量str是ansistring类型,str[1]就是第一个ascii字符,以此类推
而函数Length(str)只是取了字符串长度的信息

从这个结构可以看出,ansistring字符串最大长度2G(4个字节作为integer),
而且他并不需要以NULL结尾,因为有长度信息,同样因为这个字符串内可以包含任意
的NULL而不会被认为是字符串结尾
至于PChar就纯粹是 Point of char了

所以必须转换。至于ansistring的结尾是不是NULL,以前的版本我不知道,但Delphi3以后
的版本都是NUll的,这是编译器给你加上的,如果你更改了那个NULL对程序没有影响的
 
青萍 谈的很精辟 长进不小 谢谢!
 
接受答案了.
 
后退
顶部