
- C程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境設定
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策
- C語言 - 決策
- C語言 - if語句
- C語言 - if...else語句
- C語言 - 巢狀if語句
- C語言 - switch語句
- C語言 - 巢狀switch語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while迴圈
- C語言 - for迴圈
- C語言 - do...while迴圈
- C語言 - 巢狀迴圈
- C語言 - 無限迴圈
- C語言 - break語句
- C語言 - continue語句
- C語言 - goto語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 可變引數函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - 返回語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 從函式返回陣列
- C語言 - 變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 將指標傳遞給函式
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列的區別
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void指標
- C語言 - 懸空指標
- C語言 - 解引用指標
- C語言 - 近、遠和巨型指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列的區別
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言中的結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點(.)運算子
- C語言 - 列舉(enum)
- C語言 - 結構體填充和打包
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位段
- C語言 - Typedef
- C語言中的檔案處理
- C語言 - 輸入與輸出
- C語言 - 檔案I/O(檔案處理)
- C預處理器
- C語言 - 預處理器
- C語言 - 預處理指令
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言中的使用者自定義函式
C語言中的函式是一塊組織良好的、可重用的程式碼塊,用於執行單個相關的操作。在任何C程式中,都存在一個或多個函式——分為庫函式和使用者自定義函式。
C語言中有兩種型別的函式:
- 庫函式
- 使用者自定義函式
任何C編譯器(例如GCC編譯器、Clang、MSVC編譯器等)都附帶一些預編譯的標頭檔案(stdio.h、math.h等),每個標頭檔案包含一個或多個預定義的庫函式,例如printf()、scanf()、pow()、sqrt()等。為了能夠使用庫函式,必須使用#include指令提供相應的標頭檔案。
但是,如果您找不到合適的庫函式來滿足您的需求,則可以為程式定義一個自定義函式。通常,我們會發現一個C程式包含一個main()函式。顯然,main()函式是一個使用者自定義函式,因為它包含使用者提供的指令。當然,它也可以呼叫其他庫函式或使用者自定義函式。
什麼是C語言中的使用者自定義函式?
使用者自定義函式由使用者定義,用於執行特定任務以實現程式碼可重用性和模組化。要建立和使用使用者自定義函式,不需要使用任何內建庫。這些函式可以在同一個程式中建立,也可以在使用者自定義的標頭檔案中建立。
建立使用者自定義函式
要建立使用者自定義函式,首先需要了解函式的目的,即您希望函式執行什麼操作?
要建立使用者自定義函式,需要了解函式的以下三個部分:
- 函式宣告
- 函式定義
- 函式呼叫
使用者自定義函式的宣告
在C語言中,必須提供任何函式原型的宣告。庫函式的原型位於相應標頭檔案中。
對於使用者自定義函式,其原型位於當前程式中。函式的定義及其原型宣告必須匹配。
語法
如果您希望定義一個名為add()的函式,該函式執行兩個整數引數的加法並將值作為整數返回,則函式宣告如下:
int add(int, int);
使用者自定義函式的定義
函式的定義及其原型宣告必須匹配。定義包含與宣告匹配的函式頭和函式體。
語法
return_type function_name(arg1, arg2, ...){ // Function body; return val; }
示例
使用此模板,您可以編寫如下所示的使用者自定義函式add():
int add(int a, int b){ int c; c = a + b; return c; }
請注意,在C程式中,使用者自定義函式的定義順序並不重要。但是,必須在呼叫函式之前宣告其原型。
在一個程式中,main()函式始終是入口點,無論它是第一個函式還是其他函式。我們不需要提供main()函式的原型宣告。
呼叫使用者自定義函式
要呼叫函式,應使用符合函式原型宣告的語句。如果函式被定義為接收一定數量的引數,則必須傳遞相同數量和型別的引數來呼叫該函式。
示例
以下語句呼叫我們上面定義的add()函式:
int result = add(10, 20);
使用者自定義函式示例
在此示例中,我們建立了兩個使用者自定義函式add()和sub()來查詢給定數字的加法和減法。
// C program to demonstrate an example of // user-defined function #include <stdio.h> // Function declarations int add(int, int); int sub(int, int); // Function definitions int add(int a, int b) { return (a + b); } int sub(int a, int b) { return (a - b); } int main() { // Declaring two integer variables to // store the numbers // and resultant variables to store the result int num1 = 36, num2 = 24; int res_add, res_sub; // Calling the functions res_add = add(num1, num2); res_sub = sub(num1, num2); // Printing the results printf("Addition is : %d\n", res_add); printf("Subtraction is : %d\n", res_sub); return 0; }
Addition is : 60 Subtraction is : 12
使用者自定義函式中的形式引數和實際引數
當函式定義帶引數時,函式名前括號中的引數稱為形式引數。在上面的示例中,函式定義帶有“int a”和“int b”引數;它們是形式引數。
呼叫函式時,傳遞給它的引數稱為實際引數。在下面的示例中,變數“x”和“y”是實際引數。
int x = 10, y = 20; int result = add(x, y);
使用者自定義函式可以定義為具有任何型別的變數作為形式引數。它包括基本型別(int、float、char)、陣列、指標或struct/union型別變數。
函式應向呼叫環境返回值。預設情況下,函式的返回型別為int型別。但是,它可以返回任何資料型別——基本型別、陣列、指標或結構體以及指標。您甚至可以定義一個返回void型別的函式。
示例
如果函式的前向宣告和定義中的實際引數和形式引數的數量或型別,或者返回型別不匹配,則編譯器會報告錯誤。
請看下面的例子:
#include <stdio.h> float divide (int, int); int main(){ int x = 15, y = 5; float z = divide (x, y); printf("%f", z); return 0; } int divide (int a, int b){ int c = a/b; return c; }
輸出
在上面的程式碼中,divide()函式的宣告與其定義不匹配,因此編譯器顯示以下錯誤:
error: conflicting types for 'divide'
在C語言中,任何函式都可以呼叫任何其他函式,任何次數。函式也可以自己呼叫自己。這種自呼叫函式稱為遞迴函式。
下面的程式從main()函式內部呼叫main()函式本身:
#include <stdio.h> int main(){ printf("Hello"); main(); return 0; }
執行時,程式進入無限迴圈。實際上,必須使用遞迴,以便程式最終終止。