1. 程式人生 > >C語言中函式傳遞(實參 形參)

C語言中函式傳遞(實參 形參)

形參:在被調函式形參表中的變數名、陣列名,該過程在被呼叫前,沒有為它們分配記憶體,其作用是說明自變數的型別和形態以及在過程中的作用。 
形參可以是 合法變數名,陣列名 
實參:從主調過程傳遞給被呼叫過程的引數值。實參可以是變數名、陣列名、常數或表示式。在過程呼叫 
傳遞引數時,形參與實參是按位置結合的,形參表和實參表中對應的變數名可以不必相同,但它們的資料型別、引數個數及位置必須一一對應 
兩者關係: 
1. 形參只能是變數,實參可以是常量、變數或表示式。在被定義的函式中,必須指定形參的型別。 
2. 實參與形參的個數應一樣,型別應一致。字元型和整型可以互相通用。 
3. 在呼叫函式時,如果實參是陣列名,則傳遞給形參的是陣列的首地址 
4.實參傳遞給形參是單向傳遞,形參變數在未出現函式呼叫時,並不佔用記憶體,只在呼叫時才佔用。呼叫結束後,將釋放記憶體。執行一個被呼叫函式時,形參的值如果發生改變,並不會改變主調函式中的實參的值。 
5.形參如同公式中的符號,實參就是符號具體的值,在呼叫過程前必須得到賦值;呼叫過程就是實現形參與實參的結合,把實參的值通過呼叫傳遞給形參,相當於把值代入公式進行計算。

C語言中在發生有參函式呼叫時,實參變數與形參變數之間的資料都是單向的“值傳遞”方式。包括指標變數和陣列名作引數的情況。 
C語言要求函式的實參要有確定的值,在函式呼叫時給形參分配相應的記憶體單元,同時將實參的“值”賦(複製)給形參,實現資料從實參到形參的傳遞(‘值傳遞’方式)。因為是複製,所以在操作副本(形參)過程中不會影響到原本(實參)內容。 
首先,作為函式實參的量包括常量、變數和表示式。其中變數又包括簡單變數、陣列元素、陣列名、指標變數等。不同型別變數作引數實現的資料傳遞方式相同,效果不同。所謂方式相同即都是引數間資料單向的“值傳遞”,效果不同是指被調函式能否改變主調函式中變數的值。

情況一:簡單變數或陣列元素作為函式引數 
陣列元素本身屬於簡單變數,在向形參傳遞資料時,根據前述規則只需將變數中的“值”複製一份放到形參變數中去操作,此時在被呼叫函式中操作的物件(形參)與實參並不在同一記憶體單元,並且在呼叫結束後形參所佔記憶體單元被釋放,因此呼叫函式不會影響到實參變數的值。同時被調函式也不會影響到主調函式中其他變數的值。 
例:1

void main() 

int a=1, 
f(int a); 
printf(“%d%d”,a,f(a)); 

f(int a) 

return(++a); 

例2

void main() 

int a[3]={1,2,3}; 
f(int a); 
printf(“%d%d”,a[0],f(a[0])); 

f(int a) 

return(++a); 
}

情況二:指標變數或陣列名作為函式引數 
1.指標變數作函式引數 
指標變數作實參在呼叫時仍然符合前述“值傳遞”規則,將其“值”賦給形參,相當於複製。此時資料在實參與形參間傳遞仍是單向的,呼叫函式不會影響實參的“值”(即指標變數中所存地址)。而與簡單變數不同的是指標變數複製給形參的“值”本身是一個地址,這個地址為形參訪問其所指變數創造了可靠條件。我的理解是,實參是一個抽屜的鑰匙,在傳參時,實參複製了一把鑰匙傳給形參。而被調函式拿到鑰匙副本後,進行的操作可以分為兩類:1、對鑰匙本身做了一些操作(對指標本身進行操作);2、通過鑰匙對抽屜裡的內容進行了一些操作( 對指標所指的變數進行操作);兩種操作都不可能影響實參的值(即鑰匙原本),卻有可能改變實參所指向變數的值(即抽屜裡的內容)。