1. 如实参是一个名字或是具有左值的表达式,则左值本身传递过去。 2. 如实参是一表达式,比方a+b或2,而没有左值,则表达式先求值,并存入某一位置,然后该位置的地址传递过去。 3. 被调过程中对形式参数的任何引用和赋值都通过传递到被调过程的指针被处理成间接访问。 例如,在图10.20的程序中,若用实参i和a[i]对过程swap进行调用,即swap(i,a[i]),其效果如下步骤所述: 1. 将i和a[i]的地址(左值)拷贝到被调过程的活动记录中,比如说分别对应形参x和y的单元arg1和arg2。 2. 将局部变量temp设为由arg1所指单元的内容(即令temp等于i0,其中i0是i的初值),这一步对应于swap定义中的第6行语句:temp∶ =x。 3. 将arg1所指单元的内容设为arg2所指单元的值,即i∶=a[i0],这一步对应swap中第7行的x∶=y。 4. 将arg2所指单元的内容设为等于temp的值,即,设a[i0]=i,这一步对应y∶=temp。 通过值调用的过程可以由非局部量或由指针而对调用过程发生影响。比如图10.21的C程序中,x和y声明为整型指针(在第2行),第8行调用swap(&a,&b)中的&操作符导致将指向a和b的指针传给过程swap。该程序的输出为: a is now 2, b is now 1 该例中指针的使用恰好提示了一个编译程序怎样实现引用调用。
除了传值和传地址两种参数传递方法之外,还有"得结果"(valueresult),传名call by name等等。这里我们不予讨论。 |