引用传递如何工作?

How does pass-by-reference work?

对于主要使用指针的语言,按引用传递很容易可视化。但是在 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 }

在幕后,函数 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,但相同的原则适用于大多数帕斯卡。

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