Delphi 中的字符串


本文整理自网络,侵删。

 Delphi 中的字符串



一、Delphi 2009 之前的字符串(不支持 Unicode):

  Delphi 2009 之前的字符串分为 3 种:ShortString、AnsiString、WideString。



【ShortString】

  ShortString 是一种比较古老的 Pascal 字符串格式,它最多只能容纳 255 个字节的字符。当我们声明一个 ShortString 类型的变量时,Delphi 会自动申请 256 个字节的内存空间给该变量,其中第一个字节用来存放字符串的长度,后面的 255 个字节用来存放字符串内容,如果字符串的长度不够 255 个字节,则有多少字符就用多少内存,后面未用到的内存清零。

var
  SStr: ShortString;

  上面的声明就使 SStr 拥有了 256 个字节的内存空间:

Sizeof(SStr); { = 256; }

  直到 SStr 不再被使用时,Delphi 会自动释放 SStr 所占用的内存空间。

  我们还可以用下面的方式来声明 ShortString 类型的变量:

var
  SStr: string[16];

  这样,我们就声明了一个只能容纳 16 个字节内容的 ShortString 字符串,加上一个字节用来存放字符串的长度,SStr 一共占用 17 个字节的内存空间:

Sizeof(SStr); { = 17; }

  我们可以像使用字节数组(array of byte)那样来使用 ShortString,比如我们可以用下标来访问 ShortString 中的各个字符,可以用 High 和 Low 函数来获取 ShortString 的上限位置和下限位置。由于字符串的第一个字节存放的是字符串的长度,所以 SStr[0] 存放的是字符串的长度,例如:

var
  SStr: string[16];
begin
  SStr := 'ABC';
{ 此时:
  Ord(SStr[0]);  // = 3   字符串长度为 3
  SStr[1];       // = 'A' 第一个字符为 A
  SStr[2];       // = 'B' 第二个字符为 B
  SStr[3];       // = 'C' 第三个字符为 C
  SStr[4];       // = #0  其余位置清零 #0
  ……             //       其余位置清零 #0
  SStr[255];     // = #0  其余位置清零 #0
  High(SStr);    // = 16  上限位置为 16
  Low(SStr);     // = 0   下限位置为 0 }
end;

  接下来,我们来看看 SStr 的指针情况。

----------

{ 在一个空白窗体上放置一个 TMemo 和一个 TButton }
procedure TForm1.Button1Click(Sender: TObject);
var
  SStr: ShortString;

  pS: Pointer;
  pS1: Pointer;
begin
  SStr := 'ABC';

  pS := Addr(SStr);        { 字符串变量 SStr 的地址 }
  pS1 := Addr(SStr[0]);    { 字符串的首地址 }

  Memo1.Clear;
  Memo1.Lines.Add(IntToStr(Integer(pS)));  { 在我的电脑中显示为:1242240 }
  Memo1.Lines.Add(IntToStr(Integer(pS1))); { 在我的电脑中显示为:1242240 }
end;

----------

  上面的代码说明变量 SStr 的地址就是“存放字符串的内存块”的地址。这和后面讲到的 AnsiString 和 WideString 不同。



【AnsiString】

  AnsiString 是一种动态分配内存的字符串,也就是说当我们声明一个 AnsiString 时,它并不占用内存空间,比如:

var
  AStr: AnsiString;

  此时字符串的长度为 0,不占用内存空间:

Length(AStr);  { = 0 }

  这里为什么不用 Sizeof(AStr); 而用 Length(AStr); 因为 AStr 和 ShortString 不同,变量 AStr 的地址并不是“存放字符串的内存块”的地址,变量 AStr 中存放的只是一个指针,指向“存放字符串的内存块”,我们通过变量 AStr 可以找到“存放字符串的内存块”,请看下面的代码:

----------

{ 在一个空白窗体上放置一个 TMemo 和一个 TButton }
procedure TForm1.Button1Click(Sender: TObject);
var
  AStr: AnsiString;

  pA: Pointer;
  pA1: Pointer;
begin
  AStr := 'ABC';

  pA := Addr(AStr);       { 字符串变量 AStr 的地址 }
  pA1 := Addr(AStr[1]);   { “存放字符串的内存块”的地址。Delphi 不允许访问 AStr[0],指分配内存块中第1个字符的地址 }

  Memo1.Clear;
  Memo1.Lines.Add(IntToStr(Integer(pA)));       { 在我的电脑中显示为:1242504 }
  Memo1.Lines.Add(IntToStr(Integer(pA1)));      { 在我的电脑中显示为:17539780}

相关阅读 >>

Delphi 枚举数组

Delphi [fmx]如何使用剪贴板

Delphi之autorun(复制自身+循环扫描)

Delphi 命令行程序调用单元函数

Delphi 线程教学第一节:初识多线程

Delphi与sqlite3数据库

Delphi 一个线程安全的轻量级的日志类

Delphi里如何限制form的大小

Delphi隐藏进程

Delphi memo1删除前n行

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...