zoukankan      html  css  js  c++  java
  • 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)^) 做地址加减。

    这个语言着色有问题!

  • 相关阅读:
    容器适配器
    告别格式工厂的视频格式转换方法(mac版 命令行)
    配置CentOS7的网络为固定IP
    Java 多线程学习--线程池
    Java多线程学习--[转]
    使用VLC接收RTP流并时时播放(RTP流是pcma包)
    [转载好文]Linux下编写 makefile 详细教程
    [转载]简明 VIM 练级攻略
    linux删除不了文件, 修改文件属性也删除不了的一个解决思路
    SHELL脚本“syntax error: unexpected end of file”解决方案[半原创]
  • 原文地址:https://www.cnblogs.com/hieroly/p/2790097.html
Copyright © 2011-2022 走看看