函式內的變數大部份,我們希望能夠互相獨立以避免相互誤寫。但由於函式需要分層負責執行各自專長的資料處理工作。資料處理的原資料,以及處理的結果,都必須要能夠跨函式互傳,才能讓函式達到分工合作的目標。
傳值參數(call by value ):
由呼叫者,將欲傳入的值,以常數或合於型態的變數,放在呼叫函式()內的參數群中,傳給函式。這種方式只能單向由呼叫者給被呼叫函式輸入參數值。
例如:
#include “stdio.h”
float square(float x);
main(){
float para,return_value;
:
return_value=square(para);
:
}
float square(float x){
float y;
y=x*x;
return(y);
}
例中,para 為呼叫者準備送出資料的傳參,x 為函式接收資料的傳參。
傳址參數(call by reference):
由呼叫者,將某一個型態吻合變數的位址放在呼叫函式()內的參數群中,傳給函式。這種方式的傳輸,由於提供了函式一個可存取資料的變數位址,函式可以利用間接讀寫的方式,讀取這個變數的內容,也可以將結果寫入這一個變數傳回給呼叫者。
例如:
#include “stdio.h”
main(){
int a=1,b=2;
:
swap(&a,&b);
:
}
swap(int *x_p,int *y_p){
int tmp;
tmp=*x_p;
*x_p=*y_p;
*y_p=tmp;
}
範例中,函式swap(int *x_p,int *y_p) 的傳參int *x_p 表示參考 x _p取得的值會是一個int 型態的變數。函式呼叫 swap(&a,&b) 內的&a,&b則表示,取得變數a及,b的位址做為傳參。tmp=*x_p;為參考 x_p 取得變數存入tmp,*y_p=tmp;為由tmp 取得值存入參考 x 取得的記憶空間。
註:
1. 在等號右邊取值放到等號左邊的記憶空間。
2. &a 由變數取得參考位址。
3. *y_p 整個可視為一個變數。
4. Swap 函式可將( )內的值互換
5. tmp 暫存區
結束回傳(return):
函式將要回傳給呼叫者的值,以常數或合於型態的變數,放在回傳括號內回傳給呼叫者。這個方式,只能單向由函式回傳給呼叫者。比較特殊的是,在呼叫者如要使用回傳值來做運算或判斷,可以直接以整個呼叫函式放在運算式中或判斷式中即可。這樣的結構,讓軟體函式的運算式,與數學上的函式外觀看起來一模一樣,增高了呼叫函式的程式的可讀性。
如square(float x)前例,return(y);取 y 回傳。
呼叫函式取得回傳的值可以直接再成為另一個函式呼叫的傳參
square(square(float x))
上述的內部square()的平方計數結果會被當成外部的square()做為輸入傳參,所以綜合效果就是取4次方。