C語言基礎 (7)函式

2021-08-21 20:46:15 字數 3418 閱讀 9576

c語言裡可以採用分組方式管理語句,每個語句分組叫做乙個函式。

1、整個程式的執行時間被分成幾段,不同時間段被分配給不同函式使用。

2、所有時間段之間不能重疊,並且是連續的。

3、如果函式a在工作過程中把一段分配給函式b使用則函式b完成工作後必須把後面的時間還給函式a。

如果函式a在工作過程中把一段時間分配給函式b,則它們之間存在函式呼叫關係。在這個函式呼叫關係中函式a叫做呼叫函式,函式b叫做被呼叫函式。只有被呼叫函式工作的時間範圍內函式呼叫關係才存在。

在呼叫函式中使用函式呼叫語句才能產生函式呼叫關係。

例如:

#include 

這裡要注意:

不可以跨函式使用變數,並且不同函式裡的變數可以重名,如果乙個函式多次執行則它裡面的變數每次執行的時候代表的儲存區可能不同。(這一部分我會在隨後的變數一節中詳細講述)。

宣告變數的時候可以使用volatile關鍵字。如果變數對應的儲存區也會被其他程式使用,宣告這種變數的時候就應該使用volatile關鍵字。

函式呼叫過程中通常會伴隨著兩個函式之間的資料傳遞。資料傳遞存才兩個完全相反的方向,可以從呼叫函式向被呼叫函式傳遞也可以從被呼叫函式向呼叫函式傳遞。

任何方向的資料傳遞都是通過被呼叫函式提供的儲存區實現的。

只能從被呼叫函式向呼叫函式傳遞乙個數字,這個數字只能在被呼叫函式結束的時刻才能傳遞,這個數字叫做被呼叫函式的返回值,被呼叫函式需要提供乙個儲存區用來存放這個返回值,在被呼叫函式的名稱前要寫上這個儲存區的型別名稱。被呼叫函式裡使用return關鍵字把返回值存放到專門的儲存區里。呼叫函式裡把函式呼叫語句當做數字使用就可以獲得函式的返回值。

例如:

#include 

如果被呼叫函式裡沒有使用return關鍵字指定返回值則用來存放返回值的儲存區里的內容是隨機的。

呼叫函式獲得返回值以後或者立刻使用或者轉存到其他儲存區。如果函式不需要向呼叫函式傳遞資料就應該在函式名稱前面寫void。如果函式名稱前什麼都沒寫在c89規範裡表示函式提供乙個整數型別儲存區用來存放返回值,在c99規範裡不允許這樣。

被呼叫函式不可以採用陣列記錄返回值

可以從呼叫函式向被呼叫函式傳遞任意多個各種型別的資料。

在被呼叫函式的小括號裡編寫一組變數宣告語句,這些變數對應的儲存區用來實現從呼叫函式向被呼叫函式傳遞資料。

這些變數叫做函式的形式引數,小括號裡的所有內容叫做函式的形式引數列表。不同形式引數宣告之間用逗號分開,每個形式引數型別名稱都不可以省略。

例如:

#include 

在函式呼叫語句裡需要為每個形式引數提供乙個對應的數字,這些數字叫做實際引數。計算機把實際引數記錄在對應形式引數的儲存區里,被呼叫函式可以通過形式引數得到實際引數的數字。只要可以作為數字使用的內容都可以作為實際引數使用。

如果函式不需要從呼叫函式獲得任何數字就應該在小括號裡寫void表示不提供形式引數的儲存區。

函式名稱後的小括號裡什麼都不寫表示函式可以提供任意多個任意型別的形式引數。

陣列可以作為形式引數使用:

#include 

void print(int arr[5])

printf("\n");

}int main();

print(arr);//呼叫語句

通常使用陣列名稱作為實際引數和陣列形式引數配合使用。雖然寫成陣列的樣子,但是真正的形式引數並不是乙個陣列,而是乙個可以當做陣列使用的變數。陣列形式引數裡包含的所以儲存區都不是被呼叫函式提供的。通過陣列形式引數可以讓被呼叫函式使用其他函式提供的儲存區。呼叫函式和被呼叫函式都可以使用陣列形式引數裡的儲存區,使用可以利用陣列形式引數實現雙向資料傳遞。這種引數叫做輸入輸出引數。

宣告陣列形式引數的時候可以省略陣列裡包含的儲存區個數。這個時候需要使用另外的整數型別形式引數表示陣列裡的儲存區個數。

c語言中允許函式的形式引數的個數不確定,這種引數叫做變長引數。

變長引數不能再編寫函式的時候命名,在被呼叫函式裡需要使用特殊的方法才能獲得變長引數裡的內容。

如果編譯器先遇到函式呼叫語句就猜測被呼叫函式的個數。猜測結果裡認為函式有乙個整數型別儲存區用來存放返回值,函式可以提供任意多個任意型別的形式引數。這個猜測結果叫做函式的隱式宣告。

隱式宣告中形式引數的型別只能是整數型別或雙精度浮點型別。如果隱式宣告的格式和函式真正的格式不一致就會編譯出錯。

函式大括號前面的部分叫做函式宣告,可以把函式宣告單獨寫成一條語句放在檔案開頭,這個時候就可以省略形式引數名稱。這樣做叫做函式的顯式宣告。顯式宣告可以避免隱式宣告導致的一系列問題。除了主函式以外的所有函式都應該進行顯式宣告。

exit標準函式可以立刻結束程式的執行,為了使用這個標準函式需要包含stdlib.h標頭檔案。使用這個函式的時候需要提供乙個整數型別的實際引數,這個實際引數的作用和主函式返回值的作用一直。

c語言裡函式可以呼叫自己,這種函式叫做遞迴函式。

例如:

#include 

上面這個函式會持續不斷列印「1」,永遠不會結束。

如果乙個問題可以分解成幾個小問題,其中至少乙個小問題和原來的大問題在本質上一樣。這種問題就適合採用遞迴方式解決。

1、編寫語句描述問題的分解方式(假設遞迴函式已經編寫完成);

2、在函式的開頭編寫分支處理不可分解的情況,這個分支必須保證函式可以結束。

例如:

#include 

用遞迴函式解決問題的方法叫做遞迴;

用迴圈解決類似問題的方法叫遞推。

C語言基礎 7 函式

c語言裡可以採用分組的方式管理語句每個語句分組叫做乙個函式 多函式程式執行的模式 1.整個程式的執行時間被分成幾段,不同時間段被分配給不同的函式使用 2.所有時間段之間既不可以重疊也必須連續 3.如果函式a把一段時間分配給函式b使用則函式b在完成所有工作之後必須把後面的時間再還給函式a 如果函式a在...

C 語言基礎 7 inline內聯函式

函式呼叫是有時間和空間開銷的。程式在執行乙個函式之前需要做一些準備工作,要將實參 區域性變數 返回位址以及若干暫存器都壓入棧中,然後才能執行函式體中的 函式體中的 執行完畢後還要清理現場,將之前壓入棧中的資料都出棧,才能接著執行函式呼叫位置以後的 如果函式體 比較多,需要較長的執行時間,那麼函式呼叫...

C 語言基礎 7 inline內聯函式

函式呼叫是有時間和空間開銷的。程式在執行乙個函式之前需要做一些準備工作,要將實參 區域性變數 返回位址以及若干暫存器都壓入棧中,然後才能執行函式體中的 函式體中的 執行完畢後還要清理現場,將之前壓入棧中的資料都出棧,才能接著執行函式呼叫位置以後的 如果函式體 比較多,需要較長的執行時間,那麼函式呼叫...