Delphi - 数组和结构体

技术交流,DH讲解.

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

例如:

?

1

2

3

4

TMyStruct = record

A,B,C:Integer;

end;

T3IntArray = array[0..2]of Integer;

这两个都占12字节,而且TMyStruct.A就是T3IntArray[0].

而我们知道在访问数组中某个元素的时候,只是在第一个元素的地址 + 序号 * 元素大小.

那么访问结构体应该也是这样的,只是结构体中每个元素的大小不一定都是一样的,而数组中每个元素都是一样的.

好的我们来看段代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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]);

forI := 0 to 5 - 1do

begin

P^.A:=55;

P^.B:=66;

P^.C:=77;

Inc(P);

end;

end;

其实这个P我们相当于定义一个TMyStruct的数组,有5个元素,但是我们定义的是一个指针,而且没有分配空间,我是在aArray的空间上面使用.

也就是过程结束的时候,aArray空间被收回,那么P也就消失了.看看反汇编代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

utMain.pas.143: P:=PMyStruct(@aArray[0]);

004B6ACB 8BC4 mov eax,esp

utMain.pas.144:forI := 0 to 5 - 1do

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:forI := 0 to 5 - 1do

004B6AE9 4A dec edx

004B6AEA 75E6 jnz $004b6ad2

很清楚的看到了,访问和修改结构体中某个元素的值,也是在结构体指针上面进行偏移.

好的,下一次看看枚举.

放假了.在家米有网了.好好学习一下.