{$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下编译!
哪位大哥给个正解吧!

解决方案 »

  1.   

    应该只这样吧在你的程序中,如果没有将你申明的变量作为右值,那Delphi编译器会将这个没用的变量优化掉!
    加上这么一句就行了  ( 在Inc(p);后面 )
    p:= @j;或者只注释掉 WriteLn(Integer(@i)); 留下 WriteLn(Integer(@j));
    一句话,就是 将 j 变为右值;一家之言
      

  2.   

    楼主是分多还是时间多,一个问题重复问,重复用不同的ID问?
    http://community.csdn.net/Expert/topic/4198/4198753.xml?temp=.247616
    --------
    我居然回贴了,看来我也是无聊人 faint
      

  3.   

    inc(p);   i 与j是数组的元素会是一个正确的解
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    var  A : array[0..3] of integer;
      p: ^Integer;
    begin
      A[0] := 111;
      A[1] := 222;
      p := @A[0];
      inc(p);  //memo1.Lines.Add(inttostr(Integer(@A[0])));
      //memo1.Lines.Add(inttostr(Integer(@A[1])));
      memo1.Lines.Add(inttostr(Integer(p)));
      memo1.Lines.Add(inttostr(p^));end;两次都是正确的值