这种方式是在过程调用的代码序列中给出实参的地址 (如果实参是简单变量或下标变量,则在调用代码序列中直接给出其地址;如果实参是常数或表达式,则应产生计算它们之值并存入临时单元的中间代码,而在调用代码序列中给出此临时单元的地址等),控制转入被调过程后,由被调过程将实参的地址写入相应的形式单元。过程体中对形式参数的任何引用或赋值,都按对相应形式单元间接访问的寻址方式为其产生代码。显然,按此种方式实现形实结合,执行过程体时,对形参的赋值将会影响相应实参之值。
二、 值调用(Call by value)
值调用也是一种经常采用的方式 (PASCAL语言中的值参、C语言中的所有参数等等)。它和引用调用的主要区别在于:进入过程时,送入形式单元的不是相应实参的地址而是它的值;过程体中对形参的任何引用或赋值都是按对形式单元的直接访问来产生代码。因此,一旦把实参之值送入对应形式单元之后,在执行过程体期间,除了以实参之值作为形参的初值进行运算之外,将不再与实参发生任何联系。由此可见,过程执行的结果决不会改变实参之值。
三结果调用(Call by result)
这两种方式在某些FORTRAN语言的编译系统中使用。其特点是,为每个形参分配两个形式单元,第一单元用于存放实参的地址 (左值),第二单元用于存放实参的 (右)值 (在结果调用中,实参的值将不被传送),在执行过程体时,将只对第二单元进行操作,但在返回时,将第二单元的内容,按相应的第一单元中的地址传给实参。需注意,在结果调用中,因在进入过程时实参的值未被传送,所以,在过程体中形参的初值是不确定的,因此对形参的第一次访问必须是为其赋值,而不允许使用其值,否则,程序运行的结果将不可预测。
四名字调用(换名调用Call by name)在早期的ALGOL语言中使用,其原理是,将形参视为过程体中的一个宏,形实结合时,将形参在过程体的每个出现,均用实参表达式取而代之,为避免引起运算顺序变化,结合时将自动为实参表达式加上括号。