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
很清楚的看到了,访问和修改结构体中某个元素的值,也是在结构体指针上面进行偏移.
好的,下一次看看枚举.
放假了.在家米有网了.好好学习一下.
相关文档:
32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息。
一、创建和释放TRegistry对象
1.创建TRegistry对象。为了操作注册表,要创建一个TRegistry对象:ARegistry := TRegistry.Create;
&n ......
15本Delphi书籍(PDF格式)下载 (转)
文件名: Delphi组件参考大全.rar
下载地址: http://www.rayfile.com/files/678ca1e3-f73f-11de-9d02-0014221b798a/
文件名: Delphi信息系统开发实例精选.rar
下载地址: http://www.rayfile.com/files/fb328f02-f73e-11de-8a76-0014221b798a/
文件名 ......
技术交流,DH讲解. 哈哈,我承认我是标题党.
最近看天书夜读里面是对C语言的代码反汇编,不错,可惜Delphi没有这样的书,那我们自己动手吧.
首先进入For循环了. Function TestFor( a, b: Integer ): Integer ;
Var
I: Integer ;
Begin
Result := a + b ;
For I := 0 To 49 Do
Result := Result + I ......
技术交流,DH讲解. 之前照着天书夜读,用Delphi来弄了下循环体,现在就来弄一下条件判断吧.
首先肯定是我们经常看见的IF语句咯. Var
I: Integer;
Begin
I:= 99;
If (I> 0)And (I< 0) Then
Writeln('I>0')
Else
If (I> 10)And (I< 100) Then
Writeln('I>10 and I100');
End.
反汇编出来会是 ......
在编译delphi程序时会出现在些提示,全是E文的,现在给大家一个对照表,可以更好的理解错误提示信息!
';' not allowed before 'ELSE' ElSE前不允许有“;”
'' clause not allowed in OLE automation section 在OLE自动区段不允许“”子句
'' is not a type identifier 不是类型标识符
'' not prev ......