----------D7下
--String和Shortstring不一样!!!
vstr:string;
vShort:Shortstring;
vstr[0]这样写错误!;//vstr[1]才是第一个字符
vShort[0]这样写没问题!//vShort[0]保存的是vShort的长度:byte(vShort[0]);
-------------先说String------
var
vStr:string;
procedure TForm1.Button2Click(Sender: TObject);
begin
vStr:='555';//vStr不能放在这个procedure中声明,否则,下面的不准确,为啥不准确,俺也说不出所以然,vStr这个不要定义为局部变量;说了两遍了
Memo1.Clear;
Memo1.Lines.Add('地址:'+IntToStr(Integer(vStr)));
Memo1.Lines.Add('长度:'+IntToStr(pinteger(Integer(vStr)-4)^));
Memo1.Lines.Add('引用次数:'+IntToStr(pinteger(Integer(vStr)-8)^));
Memo1.Lines.Add('占用字节数:'+IntToStr(pinteger(Integer(vStr)-12)^));
end;
----------------------------String结束
------------------ShortString开始---------
资料参考:更深入的理解delphi7里的ShortString类型_honglei520的博客-CSDN博客 https://blog.csdn.net/honglei520/article/details/44588125
ShortString 是一种比较古老的 Pascal 字符串格式,它最多只能容纳 255 个字节的字符。当我们声明一个 ShortString 类型的变量时,Delphi 会自动申请 256 个字节的内存空间给该变量,其中第一个字节用来存放字符串的长度,后面的 255 个字节用来存放字符串内容,如果字符串的长度不够 255 个字节,则有多少字符就用多少内存,后面未用到的内存清零。
————————————————
版权声明:本文为CSDN博主「honglei520」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/honglei520/article/details/44588125
procedure TForm1.Button3Click(Sender: TObject);
var
vShort:ShortString;
begin
vshort:='空间和科技';
ShowMessage('vShort的长度:'+IntToStr(byte(vShort[0])));
end;
---------------------ShortString结束----------------------
------------------------ShortString的字符串的长度不够 255 个字节,则有多少字符就用多少内存,后面未用到的内存清零---------存在质疑!!-----开始--
procedure TForm1.Button1Click(Sender: TObject);
type
TTT=array[0..255] of Char;
var
vShort:ShortString;//感觉这个本身就占用256字节
arraystr:TTT;
i:Integer;
begin
ShowMessage(IntToStr(SizeOf(vShort))); //{256}//这个变量占256个字节
for i:=0 to 255 do
begin
arraystr[i]:=#0;//把数组全部置位#0,方便下面测试是查看arraystr的内容
end;
vshort:='空间和科技0';
ShowMessage('vShort的长度:'+IntToStr(byte(vShort[0])));
arraystr:=TTT(vshort);//下断点看到arraystr的内容和这句(则有多少字符就用多少内存,后面未用到的内存清零)不符, 未用到的内存没有清零,依然占用了
end;
-----------------------ShortString的字符串的长度不够 255 个字节,则有多少字符就用多少内存,后面未用到的内存清零---------存在质疑!!------结束-------------
--------------------------------动态数组和String类型类似,也有引用之说----------------
var
vArray:array of integer;
begin
//动态数组和String类似
Finalize(varray);
//varray:=nil;
//SetLength(varray,0) //三种释放
SetLength(varray,20);
Memo1.Clear;
Memo1.Lines.Add('地址:'+IntToStr(Integer(varray)));
Memo1.Lines.Add('长度:'+IntToStr(pinteger(Integer(varray)-4)^));
Memo1.Lines.Add('引用次数:'+IntToStr(pinteger(Integer(varray)-8)^));
Memo1.Lines.Add('占用字节数:'+IntToStr(pinteger(Integer(varray)-12)^));
end;
这里说的是动态数组!静态数组没有这样的说法
--------------------------------------------动态数组 结束-------