传递参考如何工作?

时间:2017-07-18 12:31:45

标签: pass-by-reference pascal

使用指针的语言很容易可视化传递。但是在Pascal中,我几乎看不到指针如何作为参数传递子例程。

例如:

var a: array [0..2] of integer;
    i : integer;

    procedure swap(var x, y: integer);
    var temp: integer;
    begin
       temp := x;
       x := y;
       y := temp;
    end;

begin
    i := 0;
    a[i] := 2;
    swap(i, a[i]);
end.

可以用这个等效的伪代码替换swap(i, a[i]);程序调用语句吗?这是解释器在幕后工作的方式吗?

var tmpOldArrayExpression, tmpNewFirst, tmpNewSecond : integer;
tmpOldArrayExpression := i;
(tmpNewFst, tmpNewSnd) := swap(i, a[i]);
i := tmpNewFirst; { 2 }
a[tmpOldArrayEession] := tmpNewSecond; { 0 }

2 个答案:

答案 0 :(得分:1)

在幕后,功能Swap 已实施

function Swap(x, y: ^integer); // or: PInteger
var
  temp: integer;
begin
  temp := x^;
  x^ := y^;
  y^ := temp;
end;

它实际上(但不是语法上)被称为:

i := 0;
a[i] := 2;
swap(@i, @a[i]);

Pascal是一种编译的语言。它(通常)不被解释。

要了解有关此内容的更多信息,请阅读my article explaining pointers and references, especially about reference parameters。这是关于Delphi的,但同样的原则适用于大多数Pascals。

答案 1 :(得分:0)

Afaik Pascal在这方面甚至比C更简单,因为虽然它是单独的语法,但是没有关于参数是彼此别名的规则(IIRC C确实有)