Delphi中关于PChar、Char数组、string[](ShortString)及结构体长度及占用空间的一些特性说明和测试
创始人
2024-01-26 02:12:12
0

关于特性


1,string和Char数组都是一块内存, 其中存放连续的字符. string保存具体字符的内存对用户
是透明的, 由Delphi管理它的分配, 复制和释放, 用户不能干预
2,关于ShortString,内存中用第一个字节来表示字符串的长度。FF=255,所以这个特性决定了包括的字符串长度不能大于255。
3,PChar就是纯指向字符串(#0字符结尾)的指针,与C语言中的char *是一样的,PChar是一个指针, 它的大小只有32位
4,Char数组也是指向字符串的指针,它与PChar的区别在于:
    1.char数组(均指非动态数组)一旦定义好,它的长度就固定了;
    2.char数组的地址是常量,不能另赋其它值,不能象pchar一样,
    3.其实char数组就相当于const char *

关于操作速度


至于 哪个占用内存小, Char数组<PChar(指分配过字符串的)<string(除了具体字符串外
还 包含字符串长度)
如果空字符串那么PChar<String<array [0..n] of Char
从速度来说毫无疑问string最慢,要说速度最快当然是纯指针操作的pchar与char数组最快啦
所谓占内存最少,效率最高

使用场景注意事项

所以,在Delphi结构体中,要使用或传输字符串,首选的是Char数组,如果一定要使用string,也要指定长度。比如string[20]这样。如果超过255则必须使用Char数组.
因为在结构体中如果直接使用string会有意想不到的惊喜等着你。比如:这里不采用定长的方式,那么当采用SizeOf()获取结构的大小的时候,可能得不到正确的大小值。
另外这个首位成员变量的值,很有可能出现随机值的情况,就是你已经给它赋了值,在当前的显示是正确的,但是.....自己去慢慢体会

下面是一个简单的测试
 

program Unit1;{$APPTYPE CONSOLE}usesSysUtils,Classes,IniFiles;typeTStruct=packed recordarr: array[0..50] of Char;str: string[50];end;vararr: array[0..50] of Char;str: string[50];s:string;//sl:TStringList;sl:THashedStringList;index:Integer;s1,s2:string;st:TStruct;beginbegins:='Hello';WriteLn(Format('arr长度:%d, sizeof arr: %d str长度:%d,sizeof str:%d',[Length(arr),SizeOf(arr),Length(str),SizeOf(str)]));StrPCopy(arr, s);str:=s;WriteLn(Format('arr长度:%d, sizeof arr: %d str长度:%d,sizeof str:%d',[Length(arr),SizeOf(arr),Length(str),SizeOf(str)]));WriteLn(arr);WriteLn(Format('sizeof st: %d',[SizeOf(st)]));StrPCopy(st.arr, s);st.str:=s;WriteLn(Format('sizeof st: %d',[SizeOf(st)]));sl:=THashedStringList.Create;sl.CaseSensitive:=True;   //标记是否区分大小写sl.Add('WH445306');index:=sl.IndexOf('wh445306');if index<>-1   thensl.Add('IndexOf不区分大小写')elsesl.Add('IndexOf区分大小写');WriteLn(sl.Text);s1:='WH445306';s2:='wh445306';if s1=s2 thenWriteLn('字符比较不区分大小写')elseWriteLn('字符比较区分大小写');sl.Free;Readln;  //等待键盘输入end;end.

运行效果:

印证了上面说的内容。 

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...