
- 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 - 空指標
- 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語言中的回撥函式
回撥函式用途廣泛,尤其是在事件驅動的程式設計中。當觸發特定事件時,對映到該事件的回撥函式將被執行以響應這些事件。這通常用於 GUI 應用程式中,例如按鈕點選可以啟動一系列預定義的動作。
回撥函式
回撥函式基本上是任何作為引數傳遞給其他程式碼的可執行程式碼,該程式碼預計會在給定時間回叫或執行該引數。我們可以用其他方式定義它,例如:如果函式的引用作為引數傳遞給另一個函式以進行呼叫,則稱為回撥函式。
回撥機制依賴於**函式指標**。函式指標是一個儲存函式記憶體地址的變數。
這是一個簡單的 C 語言中的 hello() 函式:
void hello(){ printf("Hello World."); }
我們如下宣告指向此函式的指標:
void (*ptr)() = &hello;
現在我們可以使用此函式指標呼叫該函式,**(*ptr)();**
C語言中回撥函式的示例
在這個例子中,hello() 函式被定義為 myfunction() 的引數。
#include <stdio.h> void hello(){ printf("Hello World\n"); } void callback(void (*ptr)()){ printf("Calling a function with its pointer\n"); (*ptr)(); // calling the callback function } main(){ void (*ptr)() = hello; callback(ptr); }
輸出
Calling a function with its pointer Hello World
帶引數的回撥函式
在下面給出的示例中,我們還聲明瞭兩個具有相同原型的函式:square() 和 root()。
int square(int val){ return val*val; } int root(int val){ return pow(val, 0.5); }
回撥函式被定義為接收一個引數以及一個具有整數引數的函式指標,該引數與上述函式匹配。
int callback(int a, int (*ptr)(int)){ int ret = (*ptr)(a); return ret; }
在 main() 函式中,我們透過傳遞一個整數和函式名(**square** / **root**)來呼叫回撥,該函式名成為回撥定義中的函式指標。
帶引數的回撥函式示例
完整的程式碼如下:
#include <stdio.h> #include <math.h> int callback(int a, int (*print_callback)(int)); int square(int value); int root (int value); int main(){ int x = 4; printf("Square of x: %d is %d\n", x, callback(x, square)); printf("Square root of x: %d is %d\n", x, callback(x, root)); return 0; } int callback(int a, int (*ptr)(int)){ int ret = (*ptr)(a); return ret; } int square(int val){ return val*val; } int root(int val){ return pow(val, 0.5); }
輸出
Square of x: 4 is 16 Square root of x: 4 is 2
C語言中回撥函式的型別
有兩種**回撥函式型別**:
同步回撥
當回撥函式傳遞給另一個函式時,該函式將其作為其過程的一部分執行,則該回調函式是同步的。呼叫函式在繼續執行之前等待回撥函式完成。當您需要立即獲得結果或希望確保在繼續執行之前完成一項任務時,這很有用。
非同步回撥
在這種情況下,呼叫函式觸發回撥函式,但不等待它完成。相反,它繼續執行。它導致非阻塞操作。它通常用於事件驅動的程式設計中。
通用回撥函式幫助開發人員編寫用途廣泛且更具適應性的 C 程式。
在本章中,我們解釋瞭如何使用函式指標來增強 C 程式的靈活性。此外,我們展示瞭如何建立不限於特定函式指標型別的通用回撥函式。