13.C 函數

1.C 函數

  1. 函數是一組一塊兒執行一個任務的語句。每一個 C 程序都至少有一個函數,即主函數 main() ,全部簡單的程序均可以定義其餘額外的函數。
  2. 您能夠把代碼劃分到不一樣的函數中。如何劃分代碼到不一樣的函數中是由您來決定的,但在邏輯上,劃分一般是根據每一個函數執行一個特定的任務來進行的。
  3. 函數聲明告訴編譯器函數的名稱、返回類型和參數。函數定義提供了函數的實際主體。
  4. C 標準庫提供了大量的程序能夠調用的內置函數。例如,函數 strcat() 用來鏈接兩個字符串,函數 memcpy() 用來複制內存到另外一個位置。

2.定義函數

C 語言中的函數定義的通常形式以下:html

return_type function_name( parameter list )
{
   body of the function
}

在 C 語言中,函數由一個函數頭和一個函數主體組成。下面列出一個函數的全部組成部分:函數

  • 返回類型:一個函數能夠返回一個值。return_type 是函數返回的值的數據類型。有些函數執行所需的操做而不返回值,在這種狀況下,return_type 是關鍵字 void
  • 函數名稱:這是函數的實際名稱。函數名和參數列表一塊兒構成了函數簽名。
  • 參數:參數就像是佔位符。當函數被調用時,您向參數傳遞一個值,這個值被稱爲實際參數。參數列表包括函數參數的類型、順序、數量。參數是可選的,也就是說,函數可能不包含參數。
  • 函數主體:函數主體包含一組定義函數執行任務的語句。

如下是 max() 函數的源代碼。該函數有兩個參數 num1 和 num2,會返回這兩個數中較大的那個數:spa

 

int max(int num1, int num2)   /* 函數返回兩個數中較大的那個數 */指針

{htm

int result;                   /* 局部變量聲明 */ 對象

if (num1 > num2)內存

result = num1; 作用域

else字符串

result = num2;get

return result;

}

 

3.函數聲明

1.函數聲明會告訴編譯器函數名稱及如何調用函數。函數的實際主體能夠單獨定義。

函數聲明包括如下幾個部分:

return_type function_name( parameter list );

2.針對上面定義的函數 max(),如下是函數聲明:

int max(int num1, int num2);

3.在函數聲明中,參數的名稱並不重要,只有參數的類型是必需的,所以下面也是有效的聲明:

int max(int, int);

當您在一個源文件中定義函數且在另外一個文件中調用函數時,函數聲明是必需的。在這種狀況下,您應該在調用函數的文件頂部聲明函數。

 

4.調用函數

建立 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

5.函數參數

若是函數要使用參數,則必須聲明接受參數值的變量。這些變量稱爲函數的形式參數

形式參數就像函數內的其餘局部變量,在進入函數時被建立,退出函數時被銷燬。

當調用函數時,有兩種向函數傳遞參數的方式:

調用類型 描述
傳值調用 該方法把參數的實際值複製給函數的形式參數。在這種狀況下,修改函數內的形式參數不會影響實際參數。
引用調用 經過指針傳遞方式,形參爲指向實參地址的指針,當對形參的指向操做時,就至關於對實參自己進行的操做。

默認狀況下,C 使用傳值調用來傳遞參數。通常來講,這意味着函數內的代碼不能改變用於調用函數的實際參數。

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 的值沒有發生變化。

 

 

 

C 引用方式調用函數

經過引用傳遞方式,形參爲指向實參地址的指針,當對形參的指向操做時,就至關於對實參自己進行的操做。

傳遞指針可讓多個函數訪問指針所引用的對象,而不用把對象聲明爲全局可訪問。

/* 函數定義 */
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,表示該函數是在其餘文件中定義的外部函數。

相關文章
相關標籤/搜索