• Delphi 数组和结构体


    技术交流,DH讲解.

    记得很早之前我就说过,数组和结构体在内存中其实一样的,他们都是连续分布的.
    例如:

        TMyStruct = record
          A,B,C:Integer;
        end;
        T3IntArray = array[0..2]of Integer;

    这两个都占12字节,而且TMyStruct.A就是T3IntArray[0].
    而我们知道在访问数组中某个元素的时候,只是在第一个元素的地址 + 序号 * 元素大小.
    那么访问结构体应该也是这样的,只是结构体中每个元素的大小不一定都是一样的,而数组中每个元素都是一样的.
    好的我们来看段代码:

    type
        TMyStruct = record
          A,B,C:Integer;
        end;
        T3IntArray = array[0..2]of Integer;
        PMyStruct = ^TMyStruct;
    
    procedure TForm2.Button2Click(Sender: TObject);
    var
      aArray:array[0..99] of Byte;
      P:PMyStruct;
      I: Integer;
    begin
      P:=PMyStruct(@aArray[0]);
      for I := 0 to 5 - 1 do
      begin
        P^.A:=55;
        P^.B:=66;
        P^.C:=77;
        Inc(P);
      end;
    end;

    其实这个P我们相当于定义一个TMyStruct的数组,有5个元素,但是我们定义的是一个指针,而且没有分配空间,我是在aArray的空间上面使用.
    也就是过程结束的时候,aArray空间被收回,那么P也就消失了.看看反汇编代码:

    utMain.pas.143: P:=PMyStruct(@aArray[0]);
    004B6ACB 8BC4             mov eax,esp
    utMain.pas.144: for I := 0 to 5 - 1 do
    004B6ACD BA05000000       mov edx,$00000005 //循环变量
    utMain.pas.146: P^.A:=55;
    004B6AD2 C70037000000     mov [eax],$00000037 //对A赋值55
    utMain.pas.147: P^.B:=66;
    004B6AD8 C7400442000000   mov [eax+$04],$00000042 //对B赋值66
    utMain.pas.148: P^.C:=77;
    004B6ADF C740084D000000   mov [eax+$08],$0000004d //对C赋值
    utMain.pas.149: Inc(P);
    004B6AE6 83C00C           add eax,$0c //移动指针,一个TMyStruct的大小是3*4=12=$0c
    utMain.pas.144: for I := 0 to 5 - 1 do
    004B6AE9 4A               dec edx
    004B6AEA 75E6             jnz $004b6ad2

    很清楚的看到了,访问和修改结构体中某个元素的值,也是在结构体指针上面进行偏移.
    好的,下一次看看枚举.
    放假了.在家米有网了.好好学习一下.

  • 相关阅读:
    梅特卡夫法则(Metcalfe's law)
    jffs2reset 实现分析
    uhttpd配置文件分析
    疑问????
    ubuntu 修改root密码
    原始套接字
    位操作
    linux命令readlink
    awk 中 FS的用法
    Python做简单爬虫(urllib.request怎么抓取https以及伪装浏览器访问的方法)
  • 原文地址:https://www.cnblogs.com/huangjacky/p/1667086.html
Copyright © 2020-2023  润新知