Lazarus 指针,数组,字符串

type
  tsArr=array [0..2] of char;
  tbArr=array [0..2] of byte;
procedure TForm1.abc;
const
  str:ansiString='abcde';
var
  s1:array [0..2] of char;
  s2:string[3];
  s3:string;
  s4:array of char;
  bArr:array [0..2] of byte;
  p:pointer;
  pC:PChar;
begin
  Memo1.Append('指针,数组,Memo新特性');
  Memo1.Append(Format('s1 的长度: %d ',[Length(s1)]));
  Memo1.Append(Format('s2 的长度: %d ',[Length(s2)]));
  Memo1.Append(Format('s3 的长度: %d ',[Length(s3)]));
  Memo1.Append(Format('s4 的长度: %d ',[Length(s4)]));
  Memo1.Append(Format('bArr 的长度: %d ',[Length(bArr)]));
  //{ 输出结果
  //s1 的长度: 3
  //s2 的长度: 0  //没有数据时长度为0
  //s3 的长度: 0  //没有分配长度为0
  //s4 的长度: 0
  //bArr 的长度: 3
  //}
  s1:=str;
  s2:=s1; //  s2:=str;  string[] 与 array [] of char 是赋值相容的
  Memo1.Append(Format('s1 地址 %x  引用地址:%x %s,%s,%s',
                      [Integer(@s1),Integer(@s1[0]) ,s1,(s1)[0],s1[0]])
                     );
  // s1 地址 214F440  引用地址:214F440 abc,a,a
  // s1^ , s1^[0] 是错误的表示方法;

  Memo1.Append(Format('s2 地址 %x  引用地址:%x %s,%s,%s',
                      [Integer(@s2),Integer(@s2[1]) ,s2,(s2)[1],s2[1]])
                     );
  //s2 地址 214F43C  引用地址:214F43D abc,a,a
  //存储空间是连续的,序号从 1 开始

  s3:=s1;
  Memo1.Append(Format('s3 地址 %x  引用地址:%x %s,%s,%s',
                      [Integer(@s3),Integer(@s3[1]) ,s3,(s3)[1],s3[1]])
                     );
  //s3 地址 214F438  引用地址:66050 abc,a,a
  //变量与引用在不同的地址空间,地址不连续。 引用序号从 1 开始

  s4:=s1;   //与String 赋值不相容,与 array [] of char 赋值相容;
  Memo1.Append(Format('s4 地址 %x  引用地址:%x %s,%s,%s',
                      [Integer(@s4),Integer(@s4[0]) ,PChar(s4),(s4)[0],s4[0]])
                     );
  //s4 地址 214F434  引用1地址:66060 ab,a,a   但长度发生变化了
  //变量与引用在不同的地址空间,地址不连续。 引用序号从 0 开始
  //输出强制 string(s4) 结果为 ab  ; Pchar(s4) 结果为 abc ; 这一点很奇怪

  bArr:=tbArr(s1);   //与String 赋值不相容,与 array [] of char 赋值相容;
  Memo1.Append(Format('bArr 地址 %x  引用地址:%x %s,%s,%s',
                      [Integer(@bArr),Integer(@bArr[0]) ,tsArr(bArr),char((bArr)[0]),char(bArr[0])]
                     )
                     );
  //bArr 地址 214F430  引用地址:214F430 abc,a,a
  //变量与引用在同一的地址空间

  pC:=PChar(s3);          //赋值相容  与   pC:=@s1  有相同的效果 ;
  Memo1.Append(Format('pC 地址 %x  引用地址:%x %s,%s,%s',
                      [Integer(@pC),Integer(pC) ,pC,(pC)[0],pC[0]])
                     );
  //pC 地址 214F428  引用地址:214F440 abc,a,a
  //变量与引用在不同的地址空间,操作同string

  p:=pointer(s4); //p:=@s1; p:=pointer(@s1);  p:=@s1[0];    p:=pointer(s3);
             //这些都可以,但shortString 就不要和指针打搅了
  Memo1.Append(Format('p 地址 %x  引用地址:%x %s,%s,%s',
                      [Integer(@p),Integer(p) ,pchar(p),char((p+1)^),char(p^)])
                     );
  //p 地址 214F42C  引用地址:214F440 abc,b,a
  //变量与引用在不同的地址空间,操作同C或C++,但操作过程有很多地方用到强制
  //Delphi 中部不可以 char((p+1)^) 做地址加减。

这个语言着色有问题!

原文地址:https://www.cnblogs.com/hieroly/p/2790097.html