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有幫助 :) 
-- 數組

相關文章
相關標籤/搜索