使用指针的语言很容易可视化传递。但是在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 }
答案 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确实有)