请问下面这个程序的输出结果是什么?
我想应该是10 20 可是执行后却是10 10
在A处不是已经将param的值改为20了吗,为什么在B处仍然输出的是10?
顺便问一下processfile和inc这2过程是干什么的,怎样用,为什么我在delphi的标准函数中没有找到它?
program point(input,output);
var param:integer;
procedure changevalue(x:integer);
var
  intptr:^integer;
begin
  intptr:=@x;
  writeln(intptr^);
  intptr^:=20;  //A
end;
begin
  param:=10;
  changevalue(param);
  writeln(param);  //B
end.

解决方案 »

  1.   

    值参和便参的区别,也就是传值和传址的区别program point(input,output);
    var param:integer;
    procedure changevalue(x:integer);
    var
      intptr:^integer;
    begin
      intptr:=@x;
      writeln(intptr^);
      intptr^:=20;  //  这儿改变的只是为子程序分配的堆栈中的参数的值
    end;
    begin
      param:=10;
      changevalue(param);
      writeln(param);  //B
    end.
      

  2.   

    楼上说得对,x在子程序中重新分配了地址,跟param所指的地址不是同一个,
      

  3.   

    对,同意
    用个变参就可,是直接传地址过来的
    procedure changevalue(var x:integer);
    begin
      writeln(x);
      x := 20;  //  这儿改变的只是为子程序分配的堆栈中的参数的值
    end;
      

  4.   

    program point(input,output);
    var param:integer;
    procedure changevalue(x:integer);
    var
      intptr:^integer;
    begin
      intptr:=@x;
      writeln(intptr^);
      intptr^:=20;  //重新为程序分配的堆栈中的参数的值
    end;
    begin
      param:=10;
      changevalue(param);
      writeln(param);  //内存地址不可以再存到过程序的外面调,因为你只是声明一个常量参数
    end.我实现你的问题,可有两种方法,一是存递数量参数,另一个是传递指针,你的程序可以改成这样:
    program point(input,output);
    var param:integer;
    procedure changevalue(x:^integer);
    var
      intptr:^integer;
    begin
      intptr:=x;
      writeln(intptr^);
      intptr^:=20;  //A
    end;
    begin
      param:=10;
      changevalue(@param);
      writeln(param);  //B
    end.
      

  5.   

    procedure changevalue(var x:integer);
    procedure changevalue(x:integer);用这两种不同的形式你执行一下,看看有什么收获   :)