引用传递如何工作?
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 确实有)
对于主要使用指针的语言,按引用传递很容易可视化。但是在 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 确实有)