1. 程式人生 > >實參和形參之間的資訊傳遞

實參和形參之間的資訊傳遞

一、 引用呼叫(Call by reference)

這種方式是在過程呼叫的程式碼序列中給出實參的地址 (如果實參是簡單變數或下標變數,則在呼叫程式碼序列中直接給出其地址;如果實參是常數或表示式,則應產生計算它們之值並存入臨時單元的中間程式碼,而在呼叫程式碼序列中給出此臨時單元的地址等),控制轉入被調過程後,由被調過程將實參的地址寫入相應的形式單元。過程體中對形式引數的任何引用或賦值,都按對相應形式單元間接訪問的定址方式為其產生程式碼。顯然,按此種方式實現形實結合,執行過程體時,對形參的賦值將會影響相應實參之值。

二、 值呼叫(Call by value)
值呼叫也是一種經常採用的方式 (PASCAL語言中的值參、C語言中的所有引數等等)。它和引用呼叫的主要區別在於:進入過程時,送入形式單元的不是相應實參的地址而是它的值;過程體中對形參的任何引用或賦值都是按對形式單元的直接訪問來產生程式碼。因此,一旦把實參之值送入對應形式單元之後,在執行過程體期間,除了以實參之值作為形參的初值進行運算之外,將不再與實參發生任何聯絡。由此可見,過程執行的結果決不會改變實參之值。

三結果呼叫(Call by result)

這兩種方式在某些FORTRAN語言的編譯系統中使用。其特點是,為每個形參分配兩個形式單元,第一單元用於存放實參的地址 (左值),第二單元用於存放實參的 (右)值 (在結果呼叫中,實參的值將不被傳送),在執行過程體時,將只對第二單元進行操作,但在返回時,將第二單元的內容,按相應的第一單元中的地址傳給實參。需注意,在結果呼叫中,因在進入過程時實參的值未被傳送,所以,在過程體中形參的初值是不確定的,因此對形參的第一次訪問必須是為其賦值,而不允許使用其值,否則,程式執行的結果將不可預測。


名字呼叫(換名呼叫Call by name)在早期的ALGOL語言中使用,其原理是,將形參視為過程體中的一個巨集,形實結合時,將形參在過程體的每個出現,均用實參表示式取而代之,為避免引起運算順序變化,結合時將自動為實參表示式加上括號。