在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
技术交流,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的空间上面使用. 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 很清楚的看到了,访问和修改结构体中某个元素的值,也是在结构体指针上面进行偏移. |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论