{$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.   

    第二次
    1243020
    13448076编译环境: windows2000 pro 及 delphi6
      

  2.   

    这个可能是Delphi优化的结果。不一定是错的。
    编译器可能根本就优化掉了
      j := 222;
    或者根本 j 都没有了,所以才会有这样的结果,你可以在 j := 222;设个断点看看Delphi究竟有没有跑这一行。(我手边没有Delphi,没法试)
      

  3.   

    Integer占4位,WriteLn(Integer(@i));      内存地址为:1242432
    WriteLn(Integer(@j));      内存地址为:1242436每一次都以4位递增,是不是因为空间没释放的原故?
      

  4.   

    [Hint] Unit1.pas(36): Value assigned to 'j' never used  //编译器当作无用的咚咚优化掉了inc(p);  {我没有研究过一个过程的连续两个变量的内存地址是不是肯定是连续的,如果不是,不知道这样做有什么意义;即使是连续的,这样做有什么实践意义?}
      

  5.   

    Project Options --> Compiler --> Optimization = False
      

  6.   

    inc(p);这句,LZ想做什么?你既然没申请一块连续的内存,天知道inc(p);之后p的地址是些什么东西?
      

  7.   

    这种情况不是delphi独有的,早在N年以前我在TC下就碰到过类似情况了
      

  8.   

    同意hthunter(核桃-我的心在下雨,雨中我和她携手漫步) 所说的。
      

  9.   

    我觉得奇怪,我的结果没有任何问题。不管去不去掉WriteLn(Integer(@i));
    WriteLn(Integer(@j));
    但是我记得在delphi里用到指针的地方一般都应该为它分配地址空间才对啊。以前我就是用到指针没有分配空间,总是出错呢。那你试一下给它分配空间呢。
      

  10.   

    delphi编译器作一堆优化,是非常smart的编译器
    未被使用的变量被优化掉了,这非常正常
    即使是定义简单的结构体你也可以试试以下两种写法有何不同
    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
      

  11.   

    另,i j 未必每次都被声明为连续的空间
    所以 inc(p);
    是有风险的
      

  12.   

    哈,这问题前几天碰过,不过是如下形式的.var
      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
      

  13.   

    j:=222;被优化掉了,单步执行一下,看看viewcpu就看到了没有产生j:=222;的代码
      

  14.   

    Speed is Delphi
    Optimization is Delphi
      

  15.   

    j被优化没了。delphi没发神经,我发现楼主在发神经哦
      

  16.   

    inc(p);这个结果是不可预知的,因为这是一个尚未分配的内存空间。不同的编译器如VC、BC、delphi有不同的结果。
      

  17.   

    inc(p);  这个要汗一下,还是先弄清楚指针怎么回事
      

  18.   

    var
      i, j: Integer;
    begin
      i := 111;
      j := 222;
      WriteLn(Integer(@i));
      WriteLn(Integer(@j));
    ....多运行几次可以发现,i,j 的地址不一定是连续分配的.有时连续,有时不连续.
    就是说,变量的地址是系统自动分配(对于程序员来说就是"未知"),研究这个未知好象没有什么意义.