谁知道什么是‘以null结尾的字符串’?---thnks!!(50分)

  • 主题发起人 主题发起人 hhcz
  • 开始时间 开始时间
以 chr(0) 结尾吧,PChar和String都是的
 
ansistring 就是以 null结尾的 自已多看看书吧. 几乎每本书上都有这方面的介绍
 
以Null結尾的字符串, 在Delphi的型態是宣告為PChar,
其實就是以一個指針, 指向一段內存起始位置, 裏面放置著字符串的內容, 並在最
後以字元#0(數值0)做為字串的結尾標示
在所有的絕大部份必需傳遞字符串的API中, 都是此種格式的字符串
在Delphi中, 為了支持此種格式的字符串處理, 有開放一系列函數, StrCopy, StrLen
StrComp, StrLComp, StrIComp, AnsiStrComp, AnsiStrLComp.....
 
pchar 是以'/0'l结尾的字符串而string不是!string是以开头的标识本字符串长度为开始
的字符串
 
谁说String不是null结尾的?
知道为什么PChar和String可以相互强制转换而不需要通过函数吗?
知道String和PChar有什么区别吗?

 
谢谢各位的参与!
在多本书上都常看到‘以null结尾的字符串’的字眼,但都没有做进一步的解释,为什么要以
以null结尾?有什么意义?和不是以null结尾的字符串有什么区别?会影响程序的编写吗?
to lorderic: 你的意思是delphi为了和API保持一致而对字符串增加这一特性,是吗?
 
Yong 回答的是向后兼容(back comp)的 String 类型,这种类型是String[N] 第一个字节(String[0])
保存串的长度;这种形式在理论上要优于('/0')结束的字符串;所以称之为Pascal风格字符串(可直接查看反汇编代码)
现在的Delphi已基本上不支持(String[N])的类型了Delphi 默认的String类型是ANSIString
类型,除非加上编译指示;
现在只不过是C++占绝对优势Delphi才不得不以#0结束;
如果还不懂请看下面的C代码
char *hx="Hello World!";
char hxo[]={'1','3','4'};
int *hxInt;
hxInt = (int *)hx;
hxInt = (int *)hxo;
如果还不懂可直接和我联系delphifans_hx@yahoo.com.cn
 
Delphi的String可以支持PChar格式, 因為它會在string的最後也放入#0字元
String變量也是一個指針, 但指向是一個Delphi定義的String結構的字符串部份
而不是單純的字元陣列, 如果以Record來表示, 它的定義應如下
TStringRec = record
AllocSiz: Longint
//內存配置大小
RefCnt: Longint
//字串引用次數
Length: Longint
//字串長度
CharArray: array[0..XXX] of char
end;
在此結構中, CharArray是可變長度的, 會依字串大小而配置
字符串變量會指向此結構CharArray的位置
如果以Length來取得S的長度, 它的做法其實是取S所指內存位置-4來取得

其實在Delphi在做為string到pchar時的強制轉換時, 也是透過函式的, 如 PChar(S)
是編釋器會將這語法轉為呼叫System的_LStrToPChar函式
怎麼做最主要避免一個問題, 是String允許nil指針來表示空字串, 幾乎所有系統的API
在傳入字符串參數傳入nil指針時, 都會出錯, 所以該函式主要來判斷, 如果傳入的S
為nil指針, 則傳回一個指向存放#0字元的內存, 以避免在呼叫API時出錯
 
最後補充一點
使用Null String結尾的字串, 最主要是作業系統Windows的API都是此種形式
包括Windows NT、2000後的Unicode版本的API都是此種觀念
 
兄弟浅薄,lorderic 研究的比我透的多,佩服的很
 
多人接受答案了。
 
后退
顶部