{$R *.dfm}
{$APPTYPE CONSOLE}procedure TForm1.Button1Click(Sender: TObject);
var
i, j: Integer;
p: ^Integer;
begin
i := 111;
j := 222;
p := @i;
inc(p); WriteLn(Integer(@i));
WriteLn(Integer(@j));
WriteLn(Integer(p));
WriteLn(p^);end;简单得不能再简单的代码了,一看就明白,以下是输出结果:
1242432
1242436
1242436
222这一切正常,可是当你去掉上面代码中的
WriteLn(Integer(@i));
WriteLn(Integer(@j));
这两句时,输出结果变成了这样:
1242444
13449308各位可以试试看看你们的Delphi会不会发神经!
Windows2000 Server下编译!
{$APPTYPE CONSOLE}procedure TForm1.Button1Click(Sender: TObject);
var
i, j: Integer;
p: ^Integer;
begin
i := 111;
j := 222;
p := @i;
inc(p); WriteLn(Integer(@i));
WriteLn(Integer(@j));
WriteLn(Integer(p));
WriteLn(p^);end;简单得不能再简单的代码了,一看就明白,以下是输出结果:
1242432
1242436
1242436
222这一切正常,可是当你去掉上面代码中的
WriteLn(Integer(@i));
WriteLn(Integer(@j));
这两句时,输出结果变成了这样:
1242444
13449308各位可以试试看看你们的Delphi会不会发神经!
Windows2000 Server下编译!
1243020
13448076编译环境: windows2000 pro 及 delphi6
编译器可能根本就优化掉了
j := 222;
或者根本 j 都没有了,所以才会有这样的结果,你可以在 j := 222;设个断点看看Delphi究竟有没有跑这一行。(我手边没有Delphi,没法试)
WriteLn(Integer(@j)); 内存地址为:1242436每一次都以4位递增,是不是因为空间没释放的原故?
WriteLn(Integer(@j));
但是我记得在delphi里用到指针的地方一般都应该为它分配地址空间才对啊。以前我就是用到指针没有分配空间,总是出错呢。那你试一下给它分配空间呢。
未被使用的变量被优化掉了,这非常正常
即使是定义简单的结构体你也可以试试以下两种写法有何不同
a = record
a1: integer;
a2: string;
end;b = packed record
b1: integer;
b2: string;
end;delphi在很多地方做优化,例如case语句等
还记得borland为delphi做的广告吗?
what is speed
speed is delphi
所以 inc(p);
是有风险的
i,j: integer;
begin //继点1
i := 1; //继点2
j := i; //继点3
end; //继点4调试时只停在继点4;
原因应该在这:
[Hint] Unit1.pas(32): Value assigned to 'j' never used
[Hint] Unit1.pas(31): Value assigned to 'i' never used
Optimization is Delphi
i, j: Integer;
begin
i := 111;
j := 222;
WriteLn(Integer(@i));
WriteLn(Integer(@j));
....多运行几次可以发现,i,j 的地址不一定是连续分配的.有时连续,有时不连续.
就是说,变量的地址是系统自动分配(对于程序员来说就是"未知"),研究这个未知好象没有什么意义.