首页 理论教育 编译原理与实践:4种参数传递方式的讨论

编译原理与实践:4种参数传递方式的讨论

时间:2023-11-17 理论教育 版权反馈
【摘要】:下面将对传地址、得结果、传值和传名等4种不同的参数传递方式分别进行讨论。当程序控制转入被调用段后,被调用段首先把实参地址抄进自己相应的形式单元中,过程体对形参的任何引用或赋值都被处理成对形式单元的间接访问。在过程体中对形参的任何引用或赋值都看成是对它的第2个单元的直接访问,但在过程工作完成返回前必须把第2个单元的内容存放到第1个单元所指的那个实参单元之中。

编译原理与实践:4种参数传递方式的讨论

作为结构化程序设计的主要手段之一,过程有助于节省程序代码以及扩充语言表达能力。只要过程有定义,就可以在别的地方调用它。调用与被调用过程之间的信息传递方式主要有两种:一种是通过全局变量传递,另一种是通过参数传递。下面将对传地址、得结果、传值和传名等4种不同的参数传递方式分别进行讨论。

1.传地址(Call by Reference)

所谓传地址方式,是指把实际参数的地址传递给相应的形式参数的一种参数传递方式。在过程定义中每个形式参数都有一个相应的单元,称为形式单元。形式单元将用来存放相应的实际参数的地址。当调用一个过程时,调用段必须预先把实际参数的地址传递到一个被调用段可以获取的地方。如果实际参数是一个变量(包括下标变量),则直接传递它的地址;如果实际参数是常数或其他表达式(如a+b),则将先计算出它的值并存放在某一临时单元之中,然后再传送该临时单元的地址。当程序控制转入被调用段后,被调用段首先把实参地址抄进自己相应的形式单元中,过程体对形参的任何引用或赋值都被处理成对形式单元的间接访问。当被调用段工作完毕返回时,形式单元所对应的实际参数单元就拥有了所期望的值。例如,对于如下的Pascal过程:

调用swap(i,a(i))所产生的结果等同于执行下列指令步骤:

(1)把i和a(i)的地址分别传递给已知单元,如J1和J2中;

(2)n:=J1;m:=J2;

(3)j:=n↑;/*n↑表示对n的间接访问*/

(4)n↑:=m↑;

(5)m↑:=j;

2.得结果(Call by Result)

与传地址方式类似,所谓得结果方式,是指每个形式参数对应有两个单元,第1个单元存放实参的地址,第2个单元存放实参的值。在过程体中对形参的任何引用或赋值都看成是对它的第2个单元的直接访问,但在过程工作完成返回前必须把第2个单元的内容存放到第1个单元所指的那个实参单元之中。(www.xing528.com)

3.传值(Call by Value)

传值是一种最简单的参数传递方式。调用段把实际参数的值计算出来并存放在一个被调用段可以获取的地方。被调用段开始工作时,首先把这些值抄进自己的形式单元中,然后就好像使用局部名一样使用这些形式单元。如果实际参数非指针,那么,此时被调用段是无法改变实参值的。对于上面关于swap的例子,若采用传值方式进行参数传递,则过程调用swap(i,a(i))将不产生任何结果。

4.传名(Call by Name)

传名是ALGOL60所定义的一种特殊的形实参数结合方式,其本质是替换,也就是说,过程调用的作用相当于把被调用段的过程体抄到调用出现的位置,再对其中任一出现的形式参数进行文字替换,替换为相应的实际参数。替换时若发现过程体中的局部名和实参中的名字使用相同的标识符,则必须用不同的标识符来表示这些局部名。并且,为了表现实参的整体性,必要时在替换前先把它用括号括起来。

例如,对于前面的过程swap,若采用传名方式传递实参,则过程调用swap(i,a(i))等价于执行下面的语句:

j:=i;

i:=a(i);

a(i):=j;

很明显,这和采用传地址或传值方式所产生的结果均不相同。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈