技术交流,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]);
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也就消失了.看看反汇编代码:
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: for I := 0 to 5 - 1 do
004B6ACD BA05000000 mov edx,$00000005
utMain.pas.146: P^.A:=55;
004B6AD2 C70037000000 mov [eax],$00000037
utMain.pas.147: P^.B:=66;
004B6AD8 C7400442000000 mov [eax+$04],$00000042
utMain.pas.148: P^.C:=77;
004B6ADF C740084D000000 mov [eax+$08],$0000004d
utMain.pas.149: Inc(P);
004B6AE6 83C00C add eax,$0c
utMain.pas.144: for I := 0 to 5 - 1 do
004B6AE9 4A dec edx
004B6AEA 75E6 jnz $004b6ad2
|
很清楚的看到了,访问和修改结构体中某个元素的值,也是在结构体指针上面进行偏移. 好的,下一次看看枚举. 放假了.在家米有网了.好好学习一下.
|
请发表评论