從形式上看,函數可分為兩類:
無參函數和
有參函數。
所謂無參函數,是指在主調函數呼叫被調函數時,主調函數不向被調函數傳遞資料。無參函數一般用來執行特定的功能,可以有返回值,也可以沒有返回值,但一般以沒有返回值居多。
有參函數,是指在主調函數呼叫被調函數時,主調函數通過引數向被調函數傳遞資料。在一般情況下,有參函數在執行被調函數時會得到一個值並返回給主調函數使用。
有參函數是重點,我們主要介紹有參函數。
有參函數
定義有參函數的一般形式為:
函數型別 函數名(引數型別1 引數名1, 引數型別2 引數名2, …, 引數型別n 引數名n)
{
宣告部分
語句部分
}
引數可以是一個,也可以是多個。下面給大家舉一個例子:
# include <stdio.h>
int main(void)
{
int Max(int x, int y); //對Max函數的宣告, x、y稱為形參
int a = 1, b = 2;
printf("max = %dn", Max(a, b)); //a、b稱為實參
return 0;
}
//定義Max函數
int Max(int x, int y)
{
int z; //函數體中的宣告部分
if (x > y) //下面是語句部分
{
z = x;
}
else
{
z = y;
}
return (z); //返回z的值給主調函數使用
}
輸出結果是:
max = 2
這個程式分兩個部分,一個是主函數 main,另一個是自定義的函數 Max。Max 函數在主函數 main 的下面,它有兩個引數,它的功能是求出 x 和 y 二者中的最大值。
形參和實參
下面先來講一下“形參”和“實參”的概念。
在定義 Max 函數時,函數名 Max 後面括號中的引數 x、y 稱為
形式引數,簡稱
形參。而在主調函數 main 中呼叫 Max 函數時,Max 函數名後面括號中的引數 a、b 稱為
實際引數,簡稱
實參。實參可以是常數、變數或表示式,但它們必須要有確定的數值。在呼叫被調函數時將實參的值賦給形參。
在定義函數時,必須要指定形參的型別。實參與形參的個數必須相等,若不相等就是語法錯誤。此外,實參與形參的型別要相同或賦值相容。最好是相同,這樣不容易出錯。如果不相同則實參按形參的型別轉化,然後再送給形參。
在傳遞資料時,實參與形參是按順序一一對應的。在 C 語言中,實參向形參的資料傳遞是“值傳遞”、單向傳遞,即只能由實參傳給形參,不能由形參傳回給實參。因此在執行被調函數時,形參的值如果發生改變,並不會改變主調函數中實參的值。
而且,在未出現函數呼叫時,形參並不佔用記憶體中的儲存單元。只有在發生函數呼叫時,函數 Max 中的形參才會被分配記憶體單元。呼叫結束後,形參所佔的記憶體單元隨之會被釋放。
定義函數時,第一行“int Max(int x,int y)”稱為函數首部。函數首部有兩個資料型別,一個是“函數型別”,另一個是“引數型別”。函數名左邊的型別叫“函數型別”,或“函數的返回值型別”。如果不想要返回值,那麼這裡就寫 void。若使用 void 就不能有返回值,否則就是語法錯誤。需要注意的是,不能有返回值不代表不能有return語句:
return;
這也是正確的。只要 return 後面什麼都不加就行,因為什麼都不加也表示沒有返回值。整個 return 語句全部都不寫也可以。但是如果需要跳出被調函數的話就寫上“return;”。
函數名後面括號中的資料型別是所傳遞的引數的型別。如果不希望定義的函數接收資料,或者說不想有引數傳遞進來,那麼這裡就寫 void 或什麼都不寫,比如 int Max(void)。這就表示拒絕接受資料傳遞,這樣實參的值就傳不進來了。主函數 main 的首部都是這麼寫的:
int main(void)
即不允許有值傳遞進來。但是,如果被調函數的引數型別定義成 void,那麼主調函數在呼叫它的時候就不能有實參,否則也是語法錯誤。
此外,如果函數名後面括號中什麼都不寫,那麼預設的也是 void。
綜上所述,函數首部的兩個資料型別是不一樣的。一個函數可以有返回值,也可以沒有返回值;可以接收資料,也可以不接收資料。這個就是通過這兩個資料型別控制的。