入门问题

jackaroo 2000-06-07 12:45:00
请教各位高手:在Delphi中,以string声明的变量一般指的是longstring,并且赋后null-terminated.那么声明如下:
var
str1:string[50];
str2:string;
begin
str1:='china';
str2:='china';
end;
此时str1,str2有何区别?它们的存储格式是否还有区别?
Pchar我知道是指向一个null-terminated字串指针。但它同string,同array of char各有何区别?array of char同 string有何不同?如果向array of char尾加#0,如何实现?
另外,pascal string到底指的是什么?它同Delphi的string有区别吗?
谢谢!
...全文
256 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kxy 2000-06-08
  • 打赏
  • 举报
回复
>>以string声明的变量一般指的是longstring,并且赋后null-terminated
此句话有误,string并不是用只用null-terminated而是使用最前面的一个字节(short string,pacasl string),longstring使用两个字节,来保存一个数值来标志
此string的长度.并且有null-terminated.
如: str1 : string ; str1 := 'test'; 那么在实际的内存中 0004+test的ASCII码+#0.你说的str1:string[50]; str2 : string,只是长度的限制不同.
delphi中的string采用引用模式和copy-on-write技术.所以你使用string时不需要
对string使用的内存操心,delphi自动替你完成了.
PChar和array of char(此不是指动态数组)没有什么区别.
PChar的内存使用要你来管理,array of char的内存在编译的时候已经分配好了.
两者都是使用null-terminated来标志字符串的结束.delphi4.0以上,string和
PChar的转换很方便,PChar到string直接副职,string到PChar , str1=PChar(apchar);
如果是动态数组的array of char,和Pchar没有区别.

给array of char 加 #0 是什么意思,
Var
aa : PChar;
bb : array[0..99] of char;
begin
GetMEM(aa,100);
aa := 'test';//已经自动加#0了.
bb := 'test';//已经自动加#0了.
FreeMem(aa); // aa要分配内存和释放,bb不需要.
end;
另外如果使用windowsAPI,传递string转化的PChar要注意.
procedre TForm1.teststring;
var
test : string;
begin
SetLength(test,100);//由于要使用windowsAPI,GetwindowText是M$的,没有delphi的机制,所以要先指定test的长度,也就是分配内存.
GetWindowText(Handle,PChar(Test),100);
//执行完了,但是delphi并不知道GetWindowText改动了test,所以length(test)
// 和strlen(Pchar(Test));的值不一致.要自己转换一下.
Test := PChar(Text);//这样就可以了,length(test)和strlen(Pchar(Test));就一样了.
end;
lixq 2000-06-08
  • 打赏
  • 举报
回复
在strutils.pas单元中,有一个函数func function ShortStringAsPchar(var S:ShortString):Pchar;它能使字符串以Null结束,这样就能传递给需要Pchar类型参数的Win32Api函数。
lixq 2000-06-08
  • 打赏
  • 举报
回复
pascal string即ShortString,也称为字节长度字符串。编译开关$H可以决定用string声明的字符串到底是ANSIString还是ShortString。str1因为设定了长度,因此,他肯定是shortstring。且不受$H的影响。短字符串的长度不能超过255。
jll 2000-06-08
  • 打赏
  • 举报
回复
str2是有长度限制的!理论上是4G,但实际只有2G(另外的2G被Windows抢走了!)
str1是单独占用内存空间的,而str2则可能只有一个内存空间,比如如果有:str3:=str2;则str3实际上是指向str2的一个指针...
array of char是动态字符数组,在使用前要SetLength一下...
xiaohuilau 2000-06-07
  • 打赏
  • 举报
回复
str1 的长度是固定的。如果长度比定义的长则被截掉。如果不足就用 chr(0) 补上。
str2 是没有固定的。
对于机器处理方面来讲str1 理所当然比 str2 处理得好。但至于用哪一个就适可而止了。
thinking_man 2000-06-07
  • 打赏
  • 举报
回复
str1的长度被限死,当超过50长度的值给它时,多余部分会被截掉。
str2的长度没有限制。
pchar是在一系列字符后面有一个被设置为零的字节的字串,而String则没有这个字节。
array of char和string的区别不大,就是array of char的赋值与string有所不同。
而string几乎就可以看作是一个array of char,可以通过下标来访问其中字符。

turbo pascal string与16位delphi的string是一样的,其最大长度为256,而32位DELPHI的STRING类型长度几乎没有限制。其区别显而易见。

5,388

社区成员

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

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