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}
-
- uses
- SysUtils,
- Classes,IniFiles;
-
-
- type
- TStruct=packed record
- arr: array[0..50] of Char;
- str: string[50];
- end;
-
- var
- arr: array[0..50] of Char;
- str: string[50];
- s:string;
- //sl:TStringList;
- sl:THashedStringList;
- index:Integer;
- s1,s2:string;
- st:TStruct;
-
- begin
-
- begin
- s:='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 then
- sl.Add('IndexOf不区分大小写')
- else
- sl.Add('IndexOf区分大小写');
- WriteLn(sl.Text);
- s1:='WH445306';
- s2:='wh445306';
- if s1=s2 then
- WriteLn('字符比较不区分大小写')
- else
- WriteLn('字符比较区分大小写');
- sl.Free;
- Readln; //等待键盘输入
- end;
-
- end.
运行效果:

印证了上面说的内容。