Delphi AnsiString 与 PAnsiChar

 

 

http://www.newsmth.net/nForum/#!article/Delphi/83api

发信人: flier (小海 //爱喝可乐^_^), 信区: Delphi        
标  题: 关于Delphi中string的一些理解 :) 
发信站: BBS 水木清华站 (Wed Nov  8 16:13:58 2000) 
  
delphi使用的object pascal对字符串类型提供了内建支持 
  
一种简单的shortstring是为兼容turbo pascal等老版本 
而保留的,具体实现是一个最大256字节的数组, 
第0个字节保存字符串的长度,而后依次是1,2...n 
结尾没有#0标识,所以老一点讲pascal的书里面都是直接用 
str[0]访问字符串str的长度的……此类型已基本上被遗弃 
  
新的所谓longstring类型是从delphi2开始引入的,由于 
delphi2开始支持32位win,并加入了对pchar的内建支持 
具体实现是一块动态分配的内存块,内存块的前两个dword 
保存着此字符串的长度和引用计数器等等信息, 
由于是用一个dword保存长度,所以字符串长度能够很是大 
呵呵,具体多大其实根本没有意义,反正用不完了 :) 
而后字符串的末尾以#0结束,以兼容window用的sz字符串类型 
所谓pchar(str)转换,其实只是取字符串的头指针罢了 
(注意这里的头指针直接指向字符串数据,不包括字符串数据头 
那两个dword) 
  
值得注意的是,delphi里面提供了一种很是强大的copy on write机制 
详细一点说就是你若是把一个字符串直接复制到另一个字符串类型 
用:=复制,则delphi只是在内存中维护一份字符串数据,至关于指针赋值 
而把此字符串的引用计数器加一,两个字符串变量都指向这个字符串数据 
可是一旦你写了其中一个字符串,delphi则自动将此字符串在内存中 
复制一遍,把你的修改反映到新的字符串数据中,这样两个变量就自动 
指向不一样的字符串数据,这些支持都是在底层自动实现的,若是你只是 
使用标准的string类型,彻底能够不关心,delphi所有本身搞定 
  
可是麻烦的是,若是你用pchar类型,或者试图把字符串传递个其余语言 
编写的模块,就必须考虑上述状况,由于一个pchar类型,其实只是一个 
指向字符数组的指针,是不存在string类型中负偏移的那些数据的 
虽然delphi内建提供了string与pchar的转换,可是若是跨语言 
或者调用api时,某些状况下必须予以考虑…… 
  
以上是偶对delphi字符串的一些理解,大部分看法都是从一本 
《Delphi 2程序设计大全》上了解的,不过到如今Delphi 5为止 
尚未什么大的变化,但愿对你们学习delphi有帮助 :) 
-- 数组

相关文章
相关标签/搜索