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/archive/2012/11/27/2790097.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值