难以理解按引用、值和名称传递

Trouble understanding pass by reference, value and name

我目前正在尝试理解示例问题中的引用传递、值和名称。

procedure practice (x,y,z); interger x,y,z;
begin
y=1;
z=y-x;
end

给出的代码看起来像,我应该根据它们的传递方式显示 n、A[1]、A[2] 的最终值

 A[1] := 1;
 A[2] := 2;
 n = 2;
 practice (A[1], n, A[n]);

我相信按值传递的值等同于原始值,因为它们保持不变,但其他两个我很难理解会发生什么。

procedure practice_by_value(x,y,z : integer);

在按值传递中 - x、y、z 是与 A[1]、n、A[2] 分开的变量,但确实获得了相应 A[1]、n、 A2]。因此,由于它们是单独的变量,正如您所说 - 如果对 x、y 或 z 进行了更改,调用者 A[1]、n、A[2] 中的变量将保持不变。

procedure practice_by_reference(var x,y,z : integer);

通过引用传递 - x、y、z 成为 A[1]、n、A[2] 的化名或别名。对 x、y、z 的任何操作都与对 A[1]、n 或 A[2] 执行的操作相同。因此,如果您在过程中修改 x、y、z,实际上是在修改调用方中的 A[1]、n、A[2]。

我不熟悉 Pascal 中的"pass by name"。

var
   A : array[1.. 10] of integer;
   n :integer;

procedure practice_by_value (x,y,z : integer);
begin
   y := 1;
   z := y-x;
end; { practice_by_value }

procedure practice_by_reference(var x,y,z : integer);
begin
   y := 1;
   z := y-x;
end; 

begin
   A[1] := 1;
   A[2] := 2;
   n := 2;
   practice_by_value (A[1], n, A[n]);
   writeln('after pass by value: ',A[1],' ',n,' ',A[2]);
   practice_by_reference(A[1],n,A[n]);
   writeln('after pass by reference : ',A[1],' ',n,' ',A[2]);   
end.

after pass by value: 1 2 2  
after pass by reference: 1 1 0