
- 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程式至少有一個函式,即main(),即使是最簡單的程式也可以定義附加函式。
當某個問題的演算法涉及冗長而複雜的邏輯時,它會被分解成更小、獨立且可重用的塊。這些小的程式碼塊在不同的程式語言中被稱為不同的名稱,例如模組、子程式、函式或方法。
您可以將程式碼分成單獨的函式。如何將程式碼劃分到不同的函式中取決於您,但邏輯上劃分是使每個函式執行特定任務。
函式宣告告訴編譯器函式的名稱、返回型別和引數。函式定義提供函式的實際主體。
C標準庫提供了許多內建函式,您的程式可以呼叫這些函式。例如,strcat()用於連線兩個字串,memcpy()用於將一個記憶體位置複製到另一個位置,以及許多其他函式。
C語言中的模組化程式設計
函式旨在執行作為整個過程一部分的特定任務。這種軟體開發方法稱為模組化程式設計。
模組化程式設計採用自頂向下的軟體開發方法。程式設計解決方案有一個主例程,透過它呼叫更小的獨立模組(函式)。
每個函式都是一個獨立的、完整的、可重用的軟體元件。當被呼叫時,函式執行指定的任務並將控制權返回給呼叫例程,可以選擇性地連同其過程的結果一起返回。
這種方法的主要優點是程式碼變得易於理解、開發和維護。
C語言中的庫函式
C語言提供許多包含在不同標頭檔案中的庫函式。例如,stdio.h標頭檔案包含printf()和scanf()函式。類似地,math.h標頭檔案包含許多函式,例如sin()、pow()、sqrt()等等。
這些函式執行預定義的任務,可以根據需要在任何程式中呼叫。但是,如果您找不到合適的庫函式來滿足您的目的,您可以自己定義一個。
在C語言中定義函式
在C語言中,有必要提供任何函式原型的向前宣告。庫函式的原型存在於相應的標頭檔案中。
對於使用者定義的函式,其原型存在於當前程式中。函式的定義及其原型宣告應該匹配。
執行函式中的所有語句後,程式的流程返回到呼叫環境。函式可能隨流程控制一起返回一些資料。
C語言中的函式宣告
函式宣告告訴編譯器函式名稱以及如何呼叫函式。函式的實際主體可以單獨定義。
函式宣告包含以下部分:
return_type function_name(parameter list);
對於上面定義的函式max(),函式宣告如下:
int max(int num1, int num2);
引數名稱在函式宣告中並不重要,只需要它們的型別,因此以下也是有效的宣告:
int max(int, int);
當您在一個原始檔中定義一個函式並在另一個檔案中呼叫該函式時,需要函式宣告。在這種情況下,您應該在呼叫該函式的檔案頂部宣告該函式。
C語言中函式的組成部分
C程式語言中函式定義的一般形式如下:
return_type function_name(parameter list){ body of the function }
C程式設計中的函式定義由函式頭和函式體組成。以下是函式的所有部分:
- 返回型別 - 函式可以返回值。return_type是函式返回值的資料型別。有些函式執行所需的操作而不返回值。在這種情況下,return_type是關鍵字void。
- 函式名稱 - 這是函式的實際名稱。函式名稱和引數列表一起構成函式簽名。
- 引數列表 - 引數(也稱為引數)就像一個佔位符。當呼叫函式時,您將值作為引數傳遞。此值稱為實際引數或引數。引數列表是指函式的引數的型別、順序和數量。引數是可選的;也就是說,函式可能不包含引數。
- 函式體 - 函式體包含定義函式作用的一組語句。
C語言中的函式應該有返回型別。函式返回的變數的型別必須是函式的返回型別。在上圖中,add()函式返回int型別。
示例:C語言中的使用者自定義函式
在這個程式中,我們使用了名為max()的使用者自定義函式。此函式接受兩個引數num1和num2,並返回兩者之間的最大值:
#include <stdio.h> /* function returning the max between two numbers */ int max(int num1, int num2){ /* local variable declaration */ int result; if(num1 > num2) result = num1; else result = num2; return result; } int main(){ printf("Comparing two numbers using max() function: \n"); printf("Which of the two, 75 or 57, is greater than the other? \n"); printf("The answer is: %d", max(75, 57)); return 0; }
輸出
執行此程式碼時,將產生以下輸出:
Comparing two numbers using max() function: Which of the two, 75 or 57, is greater than the other? The answer is: 75
在C語言中呼叫函式
在建立C函式時,您會定義函式必須執行的操作。要使用函式,您必須呼叫該函式以執行已定義的任務。
要正確呼叫函式,您需要遵守函式原型的宣告。如果函式被定義為接收一組引數,則必須傳遞相同數量和型別的引數。
當函式定義包含引數時,函式名前面的引數稱為**形式引數**。當呼叫函式時,傳遞給它的引數是**實際引數**。
當程式呼叫函式時,程式控制權將轉移到被呼叫的函式。被呼叫的函式執行定義的任務,當執行其返回語句或到達其函式結束的閉合大括號時,它將程式控制權返回給主程式。
示例:呼叫函式
要呼叫函式,只需將所需的引數與函式名一起傳遞即可。如果函式返回一個值,則可以儲存返回的值。請看下面的例子:
#include <stdio.h> /* function declaration */ int max(int num1, int num2); int main (){ /* local variable definition */ int a = 100; int b = 200; int ret; /* calling a function to get max value */ ret = max(a, b); printf( "Max value is : %d\n", ret ); return 0; } /* function returning the max between two numbers */ int max(int num1, int num2){ /* local variable declaration */ int result; if (num1 > num2) result = num1; else result = num2; return result; }
輸出
我們將max()與main()一起保留,並編譯了原始碼。執行最終的可執行檔案時,將產生以下結果:
Max value is : 200
C語言中的main()函式
C程式是由一個或多個函式組成的集合,但其中一個函式必須命名為**main()**,它是程式執行的入口點。
從main()函式內部,可以呼叫其他函式。main()函式可以呼叫庫函式,例如printf(),其原型是從標頭檔案(stdio.h)或程式碼中存在的任何其他使用者定義的函式中獲取的。
在C語言中,程式的定義順序無關緊要。在一個程式中,無論main()是第一個函式還是其他位置,它都是入口點。
**注意:**在C語言中,任何函式都可以呼叫任何其他函式,並且可以呼叫任意次數。函式也可以呼叫自身。這種自呼叫的函式稱為**遞迴函式**。
函式引數
如果函式要使用引數,它必須宣告接受引數值的變數。這些變數稱為函式的**形式引數**。
形式引數在函式內部的行為類似於其他區域性變數,在進入函式時建立,在退出函式時銷燬。
呼叫函式時,引數傳遞給函式有兩種方式:
序號 | 呼叫型別和描述 |
---|---|
1 | 值傳遞
此方法將引數的實際值複製到函式的形式引數中。在這種情況下,對函式內部引數所做的更改不會影響引數本身。 |
2 | 引用傳遞
此方法將引數的地址複製到形式引數中。在函式內部,該地址用於訪問呼叫中使用的實際引數。這意味著對引數所做的更改會影響引數本身。 |
預設情況下,C語言使用**值傳遞**來傳遞引數。一般來說,這意味著函式內的程式碼無法更改用於呼叫函式的引數。