?c語言中的小小白-CSDN博客c語言中的小小白關注算法,c++,c語言,貪心算法,鏈表,mysql,動態規劃,后端,線性回歸,數據結構,排序算法領域.https://blog.csdn.net/bhbcdxb123?spm=1001.2014.3001.5343
給大家分享一句我很喜歡我話:
知不足而奮進,望遠山而前行!!!
鐵鐵們,成功的路上必然是孤獨且艱難的,但是我們不可以放棄,遠山就在前方,但我們能力仍然不足,所有我們更要奮進前行!!!
今天我們更新了回調函數內容,
🎉 歡迎大家關注🔍點贊👍收藏??留言📝
一、回調函數是什么
我們先來看一下回調函數的最基本概念:
回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用于對該事件或條件進行響應。
光看這個概念我們可能會覺得這個東西過于抽象,下面我們用一幅圖來展示一下什么是回調函數,
假設我們要使用一個排序函數來對數組進行排序,那么在主程序(Main program)中,我們先通過庫,選擇一個庫排序函數(Library function)。但排序算法有很多,有冒泡排序,選擇排序,快速排序,歸并排序。同時,我們也可能需要對特殊的對象進行排序,比如特定的結構體等。庫函數會根據我們的需要選擇一種排序算法,然后調用實現該算法的函數來完成排序工作。這個被調用的排序函數就是回調函數(Callback function)。
結合這幅圖和上面對回調函數的解釋,我們可以發現,要實現回調函數,最關鍵的一點就是要將函數的指針傳遞給一個函數(上圖中是庫函數),然后這個函數就可以通過這個指針來調用回調函數了。注意,回調函數并不是C語言特有的,幾乎任何語言都有回調函數。在C語言中,我們通過使用函數指針來實現回調函數。
我的理解是:把一段可執行的代碼像參數傳遞那樣傳給其他代碼,而這段代碼會在某個時刻被調用執行,這就叫做回調。
如果代碼立即被執行就稱為同步回調,如果過后再執行,則稱之為異步回調。
回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。
回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用于對該事件或條件進行響應。
二、為什么要使用回調函數
因為可以把調用者與被調用者分開,所以調用者不關心誰是被調用者。它只需知道存在一個具有特定原型和限制條件的被調用函數。
簡而言之,回調函數就是允許用戶把需要調用的方法的指針作為參數傳遞給一個函數,以便該函數在處理相似事件的時候可以靈活的使用不同的方法。
回調似乎只是函數間的調用,和普通函數調用沒啥區別。
但仔細看,可以發現兩者之間的一個關鍵的不同:在回調中,主程序把回調函數像參數一樣傳入庫函數。
這樣一來,只要我們改變傳進庫函數的參數,就可以實現不同的功能,這樣有沒有覺得很靈活?并且當庫函數很復雜或者不可見的時候利用回調函數就顯得十分優秀。
三、回調函數實際應用例子
下面我們來舉一個回調函數的例子,這個例子是一個一個可以計算加法減法等,
下面我們先來看一下代碼,
#define _CRT_SECURE_NP_WARNINGS#include<stdio.h>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 menu(){printf("****************************\n");printf("********1.add 2.sub *******\n");printf("********3.mul 4.div *******\n");printf("********0.exit *******\n");
}void calc(int (*pf)(int, int)) {int x = 0, y = 0;int ret = 0;printf("請輸入兩個操作數:>");scanf("%d%d", &x, &y);ret = pf(x, y);printf("%d\n", ret);
}int main()
{int input = 0;do {menu();scanf("%d", &input);switch (input) {case 1:calc(add);break;case 2:calc(sub);break;case 3:calc(mul);break;case 4:calc(div);break;case 0:break;default:printf("輸入錯誤,請重新選擇。");break;}} while (input);return 0;
}
這便是一個計算器的代碼,當這串代碼運行之后,是一個這樣的界面:
我們可以選擇是進行加法還是減法或者其他的運算,
其中的calc函數便通過指針進行對add等函數的調用,這便是一個簡單的回調函數的例子。