Delphi AnsiString 与 PAnsiChar

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

发信人: 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有帮助 :) 
-- 

原文地址:https://www.cnblogs.com/c5soft/p/9067388.html