C 語言中的函數定義的通常形式以下:html
return_type function_name( parameter list ) { body of the function }
在 C 語言中,函數由一個函數頭和一個函數主體組成。下面列出一個函數的全部組成部分:函數
如下是 max() 函數的源代碼。該函數有兩個參數 num1 和 num2,會返回這兩個數中較大的那個數:spa
int max(int num1, int num2) /* 函數返回兩個數中較大的那個數 */指針
{htm
int result; /* 局部變量聲明 */ 對象
if (num1 > num2)內存
result = num1; 作用域
else字符串
result = num2;get
return result;
}
1.函數聲明會告訴編譯器函數名稱及如何調用函數。函數的實際主體能夠單獨定義。
函數聲明包括如下幾個部分:
return_type function_name( parameter list );
2.針對上面定義的函數 max(),如下是函數聲明:
int max(int num1, int num2);
3.在函數聲明中,參數的名稱並不重要,只有參數的類型是必需的,所以下面也是有效的聲明:
int max(int, int);
當您在一個源文件中定義函數且在另外一個文件中調用函數時,函數聲明是必需的。在這種狀況下,您應該在調用函數的文件頂部聲明函數。
建立 C 函數時,會定義函數作什麼,而後經過調用函數來完成已定義的任務。
當程序調用函數時,程序控制權會轉移給被調用的函數。被調用的函數執行已定義的任務,當函數的返回語句被執行時,或到達函數的結束括號時,會把程序控制權交還給主程序。
#include <stdio.h>
/* 函數聲明 */
int max(int num1, int num2);
int main ()
{
/* 局部變量定義 */
int a = 100;
int b = 200;
int ret;
/* 調用函數來獲取最大值 */
ret = max(a, b);
printf( "最大值爲 : %d\n", ret );
return 0;
}
/* 函數返回兩個數中較大的那個數 */
int max(int num1, int num2)
{
int result; /* 局部變量聲明 */
if (num1 > num2)
result = num1;
else
result = num2;
return result; }
把 max() 函數和 main() 函數放一塊,編譯源代碼。當運行最後的可執行文件時,會產生下列結果:
最大值爲 : 200
若是函數要使用參數,則必須聲明接受參數值的變量。這些變量稱爲函數的形式參數。
形式參數就像函數內的其餘局部變量,在進入函數時被建立,退出函數時被銷燬。
當調用函數時,有兩種向函數傳遞參數的方式:
調用類型 | 描述 |
---|---|
傳值調用 | 該方法把參數的實際值複製給函數的形式參數。在這種狀況下,修改函數內的形式參數不會影響實際參數。 |
引用調用 | 經過指針傳遞方式,形參爲指向實參地址的指針,當對形參的指向操做時,就至關於對實參自己進行的操做。 |
默認狀況下,C 使用傳值調用來傳遞參數。通常來講,這意味着函數內的代碼不能改變用於調用函數的實際參數。
向函數傳遞參數的傳值調用方法,把參數的實際值複製給函數的形式參數。在這種狀況下,修改函數內的形式參數不會影響實際參數。
默認狀況下,C 語言使用傳值調用方法來傳遞參數。通常來講,這意味着函數內的代碼不會改變用於調用函數的實際參數。函數 swap() 定義以下:
/* 函數定義 */ void swap(int x, int y) { int temp; temp = x; /* 保存 x 的值 */ x = y; /* 把 y 賦值給 x */ y = temp; /* 把 temp 賦值給 y */ return; }
調用函數 swap():
#include <stdio.h> /* 函數聲明 */ void swap(int x, int y); int main () { /* 局部變量定義 */ int a = 100; int b = 200; printf("交換前,a 的值: %d\n", a ); printf("交換前,b 的值: %d\n", b ); /* 調用函數來交換值 */ swap(a, b); printf("交換後,a 的值: %d\n", a ); printf("交換後,b 的值: %d\n", b ); return 0; }
當上面的代碼被編譯和執行時,它會產生下列結果:
交換前,a 的值: 100 交換前,b 的值: 200 交換後,a 的值: 100 交換後,b 的值: 200
上面的實例代表了,雖然在函數內改變了 a 和 b 的值,可是實際上 a 和 b 的值沒有發生變化。
經過引用傳遞方式,形參爲指向實參地址的指針,當對形參的指向操做時,就至關於對實參自己進行的操做。
傳遞指針可讓多個函數訪問指針所引用的對象,而不用把對象聲明爲全局可訪問。
/* 函數定義 */ void swap(int *x, int *y) { int temp; temp = *x; /* 保存地址 x 的值 */ *x = *y; /* 把 y 賦值給 x */ *y = temp; /* 把 temp 賦值給 y */ return; }
如今,讓咱們經過引用傳值來調用函數 swap():
#include <stdio.h> /* 函數聲明 */ void swap(int *x, int *y); int main () { /* 局部變量定義 */ int a = 100; int b = 200; printf("交換前,a 的值: %d\n", a ); printf("交換前,b 的值: %d\n", b ); /* 調用函數來交換值 * &a 表示指向 a 的指針,即變量 a 的地址 * &b 表示指向 b 的指針,即變量 b 的地址 */ swap(&a, &b); printf("交換後,a 的值: %d\n", a ); printf("交換後,b 的值: %d\n", b ); return 0; }
當上面的代碼被編譯和執行時,它會產生下列結果:
交換前,a 的值: 100 交換前,b 的值: 200 交換後,a 的值: 200 交換後,b 的值: 100
上面的實例代表了,與傳值調用不一樣,引用調用在函數內改變了 a 和 b 的值,實際上也改變了函數外 a 和 b 的值。
根據函數可否被其餘源文件調用,將函數區分爲內部函數和外部函數。
若是一個函數只能被本文件中其餘函數所調用,它稱爲內部函數。在定義內部函數時,在函數名和函數類型的前面加 static,即
static 類型名 函數名 (形參表)
例如,函數的首行:
static int max(int a,int b)
內部函數又稱靜態函數。使用內部函數,可使函數的做用域只侷限於所在文件。即便在不一樣的文件中有同名的內部函數,也互不干擾。提升了程序的可靠性。
若是在定義函數時,在函數的首部的最左端加關鍵字 extern,則此函數是外部函數,可供其它文件調用。
如函數首部能夠爲
extern int max (int a,int b)
C 語言規定,若是在定義函數時省略 extern,則默認爲外部函數。
在須要調用此函數的其餘文件中,須要對此函數做聲明(不要忘記,即便在本文件中調用一個函數,也要用函數原型來聲明)。在對此函數做聲明時,要加關鍵字 extern,表示該函數是在其餘文件中定義的外部函數。