C語言函數

來源:互聯網
上載者:User

標籤:

一、函數的分類

  前面已經說過,C語言中的函數就是物件導向中的"方法",C語言的函數可以大概分為3類:

  1.主函數,也就是main函數。每個程式中只能有一個、也必須有一個主函數。無論主函數寫在什麼位置,C程式總是從主函數開始執行

  2.開發人員自訂的函數,可有可無,數目不限

  3.C語言提供的庫函數,例如stdio.h中的輸出函數printf()和輸入函數scanf()

 

二、函數的聲明和定義

  1.在標準C語言中,函數的定義順序是有講究的,預設情況下,只有後面定義的函數才可以調用前面定義過的函數

int sum(int a, int b) {     return a + b; }  int main() {     int c = sum(1, 4);     return 0; }

   注意:第5行定義的main函數調用了第1行的sum函數,這是合法的。如果調換下sum函數和main函數的順序,在標準的C編譯器環境下是不合法的(不過在Xcode中只是警告,Xcode中用的是GCC編譯器)

 

  2.如果想把其他函數的定義寫在main函數後面,而且main函數能正常調用這些函數,那就必須在main函數前面作一下函數的聲明 

// 只是做個函式宣告,並不用實現 int sum(int a, int b);  int main() {     int c = sum(1, 4);     return 0; }  // 函數的定義(實現) int sum(int a, int b) {     return a + b; }

  我們在第2行做了sum函數的聲明,然後在第6行(main函數中)就可以正常調用sum函數了。

  函數的聲明格式:傳回值類型 函數名 (參數1, 參數2, ...)

  可以省略參數名稱,比如上面的sum函式宣告可以寫成這樣:

int sum(int, int);

  只要你在main函數前面聲明過一個函數,main函數就知道這個函數的存在,就可以調用這個函數。究竟這個函數是做什麼用,還要看函數的定義。如果只有函數的聲明,而沒有函數的定義,那麼程式將會在連結時出錯。

 

  3.在大型的C程式中,為了分模組進行開發,一般會將函數的聲明和定義(即實現)分別放在2個檔案中,函式宣告放在.h標頭檔中,函數定義放在.c源檔案中

  下面我們將sum函數的聲明和定義分別放在sum.h和sum.c中

  sum.h檔案

  

  sum.c檔案

  

  然後在main.c中包含sum.h即可使用sum函數

  其實sum.h和sum.c的檔案名稱不一樣要相同,可以隨便寫,只要檔案名稱是合法的

  運行步驟分析:

    (1) 在編譯之前,先行編譯器會將sum.h檔案中的內容拷貝到main.c中

    (2) 接著編譯main.c和sum.c兩個源檔案,產生目標檔案main.obj和sum.obj,這2個檔案是不能被單獨執行的,原因很簡單:

      a)sum.obj中不存在main函數,肯定不可以被執行

      b)main.obj中雖然有main函數,但是它在main函數中調用了一個sum函數,而sum函數的定義卻存在於sum.obj中,因此main.obj依賴於sum.obj

    (3)把main.obj、sum.obj連結在一起,產生可執行檔

    (4)運行程式

 

4.說到這裡,有人可能有疑惑:可不可以在main.c中包含sum.c檔案,不要sum.h檔案了?

  

大家都知道#include的功能是拷貝內容,因此上面的代碼等效於:

  這麼一看,文法上是絕對沒有問題的,但是絕對運行不起來,在連結時會出錯。原因:編譯器會編譯所有的.c源檔案,這裡包括main.c、sum.c,編譯成功後產生sum.obj、main.obj檔案,當連結這兩個檔案時連結器會發現sum.obj和main.obj裡面都有sum函數的定義,於是報"標識符重複"的錯誤。

 

三、函數的形參和實參

  1.在定義函數時,函數名後面的()中定義的變數稱為形式參數(形參);在調用函數時傳入的值稱為實際參數(實參)。  

// b是test函數的形參(形式參數)void test(int b) {    b = 9; // 改變了形參b的值}int main(){    int a = 10;    printf("函數調用前的a:%d\n", a);        test(a); // a是test函數的實參(實際參數)    printf("函數調用後的a:%d", a);    return 0;}

  2.如果是基礎資料型別 (Elementary Data Type)作為函數的形參,那是簡單的值傳遞,將實參a的值賦值給了形參b,相當於

int a = 10;int b = a;b = 9;

a和b是分別有著不同記憶體位址的2個變數,因此改變了形參b的值,並不會影響實參a的值。

上述代碼的輸出結果為:

C語言函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.