标签:
技术交流,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,esputMain.pas.144: for I := 0 to 5 - 1 do004B6ACD BA05000000       mov edx,$00000005 //循环变量utMain.pas.146: P^.A:=55;004B6AD2 C70037000000     mov [eax],$00000037 //对A赋值55utMain.pas.147: P^.B:=66;004B6AD8 C7400442000000   mov [eax+$04],$00000042 //对B赋值66utMain.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=$0cutMain.pas.144: for I := 0 to 5 - 1 do004B6AE9 4A               dec edx004B6AEA 75E6             jnz $004b6ad2 | 
很清楚的看到了,访问和修改结构体中某个元素的值,也是在结构体指针上面进行偏移.
好的,下一次看看枚举.
放假了.在家米有网了.好好学习一下.
标签:
原文地址:http://www.cnblogs.com/chenmfly/p/4858924.html