C回調函數基礎用法

📌 定義:

回調函數是通過函數指針傳遞給另一個函數的函數,這個被傳進去的函數將在某個時刻被“回調”調用。

換句話說:

  • 你定義一個函數 A

  • 把函數 A 的地址(即函數指針)作為參數傳給函數 B

  • 函數 B 在合適的時機調用 A(即“回調”)

📍作用:

用于 “動態行為”插件機制自定義邏輯注入,非常常見于庫函數、操作系統、圖形界面、信號處理等場景。

回調函數 = 把函數指針作為參數傳進去,在“合適時機”通過這個指針調用你傳進去的函數。

?code

基礎code

void menu()
{printf("********************\n");printf("****1.add****2.sub**\n");printf("****3.mul****4.div**\n");printf("****0.exit**********\n");
}
int add(int x, int y)
{return x + y;
}
int sub(int x, int y)
{return x - y;
}
int mul(int x, int y)
{return x * y;
}
int div(int x, int y)
{return x / y;
}
int main()
{menu();int input = 0;int x = 0;int y = 0;int ret = 0;do{printf("輸入計算類型->\n");scanf("%d", &input);switch (input){case 1:printf("輸入兩個計算數字\n");scanf("%d %d", &x, &y);ret = add(x, y);printf("%d\n", ret);break;case 2:printf("輸入兩個計算數字\n");scanf("%d %d", &x, &y);ret = sub(x, y);printf("%d\n", ret);break;case 3:printf("輸入兩個計算數字\n");scanf("%d %d", &x, &y);ret = mul(x, y);printf("%d\n", ret);break;case 4:printf("輸入兩個計算數字\n");scanf("%d %d", &x, &y);ret = div(x, y);printf("%d\n", ret);break;default:printf("輸入無效,請重新輸入\n");break;}} while (input);return 0;
}

?回調函數示例--------減少冗余code

void menu()
{printf("********************\n");printf("****1.add****2.sub**\n");printf("****3.mul****4.div**\n");printf("****0.exit**********\n");
}
int add(int x, int y)
{return x + y;
}
int sub(int x, int y)
{return x - y;
}
int mul(int x, int y)
{return x * y;
}
int div(int x, int y)
{return x / y;
}
void calcu (int(*pf)(int,int))
{int x = 0;int y = 0;int ret = 0;printf("輸入兩個計算數字\n");scanf("%d %d", &x, &y);ret = pf(x, y);printf("%d\n", ret);
} 
int main()
{menu();int input = 0;do{printf("輸入計算類型->\n");scanf("%d", &input);switch (input){case 1:calcu(add);break;case 2:calcu(sub);break;case 3:calcu(mul);break;case 4:calcu(div);break;default:printf("輸入無效,請重新輸入\n");break;}} while (input);return 0;
}

函數指針數組的調用形式

void menu()
{printf("********************\n");printf("****1.add****2.sub**\n");printf("****3.mul****4.div**\n");printf("****0.exit**********\n");
}
int add(int x, int y)
{return x + y;
}
int sub(int x, int y)
{return x - y;
}
int mul(int x, int y)
{return x * y;
}
int div(int x, int y)
{return x / y;
}int main()
{menu();int input = 0;int x = 0;int y = 0;int ret = 0;int (*arr[])(int, int) = { 0,add,sub,mul,div };printf("請輸入計算類型->");do{scanf("%d", &input);if (input == 0){printf("退出程序");}else if (input >= 1 && input <= 4){printf("請輸入兩個操作數");scanf("%d %d", &x, &y);/*	for ( int i = 1; i < 5;  i++){ret = arr[i](x, y);printf("%d \n", ret);}*/ret = arr[input](x, y);printf("%d \n", ret);}else{printf("輸入錯誤,請重新輸入");}} while (input);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89250.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89250.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89250.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

手撕設計模式之消息推送系統——橋接模式

手撕設計模式之消息推送系統——橋接模式 1.業務需求 ? 大家好&#xff0c;我是菠菜啊&#xff0c;好久不見&#xff0c;今天給大家帶來的是——橋接模式。老規矩&#xff0c;在介紹這期內容前&#xff0c;我們先來看看這樣的需求&#xff1a;我們現在要做一個消息推送系統&…

Java 大廠面試題 -- JVM 垃圾回收機制大揭秘:從原理到實戰的全維度優化

最近佳作推薦&#xff1a; Java 大廠面試題 – JVM 面試題全解析&#xff1a;橫掃大廠面試&#xff08;New&#xff09; Java 大廠面試題 – 從菜鳥到大神&#xff1a;JVM 實戰技巧讓你收獲滿滿&#xff08;New&#xff09; Java 大廠面試題 – JVM 與云原生的完美融合&#xf…

圖機器學習(9)——圖正則化算法

圖機器學習&#xff08;9&#xff09;——圖正則化算法1. 圖正則化方法2. 流形正則化與半監督嵌入3. 神經圖學習4. Planetoid1. 圖正則化方法 淺層嵌入方法已經證明&#xff0c;通過編碼數據點間的拓撲關系可以構建更魯棒的分類器來處理半監督任務。本質上&#xff0c;網絡信息…

視頻動態范圍技術演進:從SDR到HDR的影像革命

一、動態范圍技術基礎認知 1.1 人眼視覺特性與動態范圍 人眼的動態感知范圍可達106:1&#xff08;0.0001-105 cd/m&#xff09;&#xff0c;遠超傳統顯示設備能力。視網膜通過虹膜調節&#xff08;物理孔徑&#xff09;與光化學反應&#xff08;光敏蛋白分解&#xff09;實現16…

基于LAMP環境的校園論壇項目

1.配置本地倉庫a.修改主機名為自己姓名全拼[rootserver ~]# hostnamectl set-hostname jun [rootserver ~]# bash [rootjun ~]# 運行結果圖如下圖所示&#xff1a;b.光盤掛載到/mnt目錄下[rootjun yum.repos.d]# mount /dev/sr0 /mnt mount: /mnt: WARNING: source write-prote…

在物聯網系統中時序數據庫和關系型數據庫如何使用?

在物聯網系統中&#xff0c;時序數據庫&#xff08;TSDB&#xff09;和關系型數據庫&#xff08;RDBMS&#xff09;的存儲順序設計需要根據數據特性、業務需求和系統架構綜合考慮。以下是典型的設計方案和邏輯順序&#xff1a;1. 常見存儲順序方案 方案一&#xff1a;先寫時序數…

django安裝、跨域、緩存、令牌、路由、中間件等配置

注意&#xff1a;如果是使用 PyCharm 編程工具就不用創建虛擬化&#xff0c;直接打開 PyCharm 選擇新建的目錄直接調過下面的步驟11. 項目初始化如果不是用 PyCharm 編輯器就需要手動創建虛擬環境在項目目錄cmd&#xff0c;自定義名稱的虛擬環境# 激活虛擬環境 python -m venv …

時間的弧線,邏輯的航道——標準單元延遲(cell delay)的根與源

時序弧 在這篇文章中&#xff0c;我們將討論影響標準單元延遲的因素。在開始討論之前&#xff0c;我們需要先了解一下什么是時序弧 (Timing Arcs)&#xff1a; 時序弧 (Timing Arcs)&#xff1a; 時序弧代表了信號從一個輸入流向一個輸出的方向。它存在于組合邏輯和時序邏輯中&…

《透視定軸:CSS 3D魔方中視覺層級的秩序法則》

當CSS的代碼編織出一個能自由旋轉的3D魔方&#xff0c;六個色彩各異的面在空間中翻轉、重疊時&#xff0c;最考驗技術的并非旋轉動畫的流暢度&#xff0c;而是每個面在任意角度下都能保持符合現實邏輯的前后關系。為何有時某個面會突兀地“穿透”另一個面&#xff1f;為何旋轉到…

RTL編程中常用的幾種語言對比

以下是RTL&#xff08;寄存器傳輸級&#xff09;編程中常用的幾種硬件描述語言&#xff08;HDL&#xff09;及其核心差異的對比分析。RTL編程主要用于數字電路設計&#xff0c;通過描述寄存器間的數據傳輸和邏輯操作實現硬件功能。以下內容綜合了行業主流語言的技術特性與應用場…

前端面試題(HTML、CSS、JavaScript)

目錄 一、HTML src與href區別 對html語義化理解 語義化標簽有哪些&#xff1f; script中的defer與async區別 行內元素與塊級元素有哪些&#xff1f; canvas與svg區別 SEO優化 html5新特性 二、CSS 盒模型 選擇器優先級 偽元素與偽類 隱藏元素幾種方式 水平/垂直…

Linux-線程控制

線程等待pthread_join()pthread_join 是 Linux 系統中用于線程同步的重要函數&#xff0c;主要作用是等待指定線程結束并回收其資源。基本功能- 阻塞當前調用線程&#xff0c;直到目標線程執行結束。 - 回收目標線程的資源&#xff0c;避免產生“僵尸線程”。 - 可選地獲取目標…

RAG優化秘籍:基于Tablestore的知識庫答疑系統架構設計

目錄一、技術架構設計二、雙流程圖解析橫向架構對比縱向核心流程三、企業級代碼實現Python檢索核心TypeScript前端接入YAML部署配置四、性能對比驗證五、生產級部署方案六、技術前瞻分析附錄&#xff1a;完整技術圖譜一、技術架構設計 原創架構圖 #mermaid-svg-3Ktoc4oH4xlbD6…

i.mx8 RTC問題

項目場景&#xff1a;需要增加外置RTC&#xff0c;保證時間的精準。問題描述&#xff1a;基本情況&#xff0c;外置i2c接口的RTC&#xff0c;注冊、讀寫都正常&#xff0c;但是偶發性重啟后&#xff0c;系統時間是2022&#xff0c;rtc時間是1970&#xff0c;都像是恢復了默認時…

數據集相關類代碼回顧理解 | utils.make_grid\list comprehension\np.transpose

目錄 utils.make_grid list comprehension np.transpose utils.make_grid x_gridutils.make_grid(x_grid, nrow4, padding2) make_grid 函數來自torchvision的utils模塊&#xff0c;用于圖像數據可視化&#xff0c;將一批圖像排列成一個網格。 x_grid&#xff1a;四維圖像…

C#中Static關鍵字解析

本文僅作為參考大佬們文章的總結。 Static關鍵字是C#語言中一個基礎而強大的特性&#xff0c;它能夠改變類成員的行為方式和生命周期。本文系統性總結static關鍵字的各類用法、核心特性、適用場景以及需要注意的問題&#xff0c;以幫助掌握這一重要概念。 一、Static關鍵字概…

通用綜合文字識別聯動 MES 系統:OCR 是數據流通的核心

制造業的 MES 系統需實時整合生產數據以調控流程&#xff0c;但車間的工單、物料標簽、質檢報告等多為紙質或圖片形式&#xff0c;傳統人工錄入不僅滯后&#xff0c;還易出錯&#xff0c;導致 MES 系統數據斷層。通用綜合文字識別借助 OCR 技術&#xff0c;成為連接這些信息與 …

【Linux 學習指南】網絡編程基礎:從 IP、端口到 Socket 與 TCP/UDP 協議詳解

文章目錄&#x1f4dd;理解源IP地址和目的IP地址&#x1f320; 認識端口號&#x1f309;端口號范圍劃分&#x1f309;理解"端口號"和"進程ID"&#x1f309;理解源端口號和目的端口號&#x1f309;理解socket&#x1f320;傳輸層的典型代表&#x1f309;認識…

React+Next.js+Tailwind CSS 電商 SEO 優化

一、項目背景與技術選型?1. 原始痛點?項目最初基于純 React 開發&#xff08;SPA 架構&#xff09;&#xff0c;存在三個致命問題&#xff1a;?搜索引擎爬蟲無法有效抓取動態渲染的商品詳情、分類頁內容&#xff1b;?單頁面應用 難以實現頁面級的 meta 定制&#xff0c;關鍵…

Process Lasso:提升電腦性能的得力助手

在日常使用電腦的過程中&#xff0c;我們常常會遇到這樣的問題&#xff1a;電腦運行緩慢、程序響應遲緩、多任務處理時卡頓不斷。這些問題不僅影響工作效率&#xff0c;還讓人感到非常煩躁。其實&#xff0c;這些問題很多時候是因為電腦的進程管理不夠優化。而Process Lasso正是…