PChar和AnsiString的区别?AnsiString和windeString的区别?

LINUXFANS 2002-06-23 11:29:13
这是D5中的一段。我不明白PChar和AnsiString的区别是什么。为什么要调用PChar(S)?还要用RealizeLenght()该回来?

“注意在练习将一个字符串转换为PChar类型时要小心,因为字符串在超出其作用范围时有自动回收的功能,因此当进行P:=PChar(Str)的赋值时,P 的作用域(生存期)应当大于Str 的作用域。”

这段话是什么意思?P的作用域如果不大于Str回怎么样?

windeString中的每个字符是2个字节?AnsiString每个字符是1个字节那AnsiString和windeString的为什么可以直接转换。转换后的字节数是怎么定?

原文:
正如前面所提到,AnsiString 字符串总是null 结束的。因此,它能跟以null 结尾的字符串兼容,这
就使得调用Win32 API 函数或其他需要PChar 型字符串的函数变得容易了。只要把一个字符类型强制转
换为PChar 类型(在2 . 8 节“强制类型转换和类型约定”中将介绍强制类型转换)。下面的代码演示了怎
样调用Win32的GetWindowsDirectory( )函数,这个函数需要一个PChar类型的参数:
var
S:String;
begin
SetLength(S,256); //重要!首先给字符串分配空间
/ /调用A P I 函数,S 现在包含目录字符串
GetWindowsDirectory(PChar(S),256) ;
如果使用了将A n s i S t r i n g 字符串强制转换为PChar类型的函数和过程,在使用结束后,要手工把它
第2 章Object Pascal 语言2 7 下载
的长度恢复为原来以n u l l 结束的长度。STRUTILS单元中的RealizeLenght( )函数可以实现这一点:
procedure RealizeLength(var S:string);
b e g i n
SetLength(S,StrLen(PChar(S)));
e n d ;
调用ReallizeLength( ) :
var
S:string ;
begin
SetLength(S,256); //重要!首先给字符串分配空间
/ /调用函数,S 现在包含目录字符串
GetWindowDirectory(PChar(S),256) ;
RealizeLength(S); //设置S 的长度为n u l l 结束的长度
e n d ;
注意在练习将一个字符串转换为P C h a r 类型时要小心,因为字符串在超出其作用范围时有自动回收的功能,因此当进行P:=PChar(Str)的赋值时,P 的作用域(生存期)应当大于Str 的作用域。
...全文
117 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhourongbiao 2002-06-24
  • 打赏
  • 举报
回复
WideString是Unicode字符串,用2个字节表示一个字符,而AnsiString则用1个字节表示一个字符,但是目前所用的string大部分为AnsiString,但WideString在将来的使用不可避免。
xiaoxingchi 2002-06-24
  • 打赏
  • 举报
回复
D e l p h i有三种类型的字符:
• AnsiChar 这是标准的1字节的A N S I字符,程序员都对它比较熟悉。
• WideChar 这是2字节的U n i c o d e字符。
• Char 在目前相当于A n s i C h a r, 但在D e l p h i以后版本中相当于Wi d e C h a r.
记住因为一个字符在长度上并不表示一个字节,所以不能在应用程序中对字符长度进行硬编码,
而应该使用S i z e o f ( )函数。
注意Sizeof()标准函数返回类型或实例的字节长度。
===============字符串
字符串是代表一组字符的变量类型,每一种语言都有自己的字符串类型的存储和使用方法。
P a s c a l类型有下列几种不同的字符串类型来满足程序的要求:
• AnsiString 这是P a s c a l缺省的字符串类型,它由AnsiChar 字符组成,其长度没有限制,同时与
n u l l结束的字符串相兼容。
• ShortString 保留该类型是为了向后兼容Delphi 1.0,它的长度限制在2 5 5个字符内。
• WideString 功能上类似于A n s i S t r i n g,但它是由Wi d e C h a r字符组成的。
• PChar 指向n u l l结束的C h a r字符串的指针,类似于C的char * 或l p s t r类型。
• PAnsiChar 指向n u l l结束的A n s i C h a r字符串的指针。
• PWideChar 指向n u l l结束的Wi d e C h a r字符串的指针。
缺省情况下,如果用如下的代码来定义字符串,编译器认为是AnsiString 字符串:
v a r
S:string; //编译器认为S的类型是A n s i S t r i n g
当然,能用编译开关$ H来将s t r i n g类型定义为S h o r t S t r i n g,当$ H编译开关的值为负时, s t r i n g变量
是S h o r t S t r i n g类型;当$ H编译开关的值为正时(缺省情况),字符串变量是A n s i S t r i n g类型。下面的代码
演示了这种情况:
v a r
{ $ H - }
S1:string; //S1是S h o r t S t r i n g类型
{ $ H + }
S2:string; //S2是A n s i S t r i n g类型
使用$ H规则的一个例外是,如果在定义时特地指定了长度(最大在2 5 5个字符内),那么总是
S h o r t S t r i n g:
v a r
S: string[63]; //63个字符的S h o r t S t r i n g字符串
1. AnsiString类型
A n s i S t r i n g (或长字符串)类型是在Delphi 2.0开始引入的,因为Delphi 1.0的用户特别需要一个容易
使用而且没有2 5 5个字符限制的字符串类型,而A n s i S t r i n g正好能满足这些要求。
bcb_fans 2002-06-23
  • 打赏
  • 举报
回复
哇,说得那么复杂!!!

pchar是字符串指针,类似于c中的char*
AnsiString是Delphi中的String类型的C++模拟;
WideString与AnsiString类似,但支持Unicode.

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧