回調(diào)函數(shù)的理解
前言: 剛開始用C語言聽說過回調(diào)函數(shù),但沒有仔細去理解,隨著工作的慢慢積累,逐步的用到了回調(diào)函數(shù),本人認為,“回調(diào)函數(shù)”的理解對于很多人是一個檻,要想跨過,就得理解清楚,還得會用。這里就用本人的方式講解一下回調(diào)函數(shù)如何理解。如有問題,歡迎指正mr.li.ming@qq.com。
第一步:通俗的解釋“回調(diào)函數(shù)”一、回調(diào)就是一種利用函數(shù)指針進行函數(shù)調(diào)用的過程。 二、你到一個商店買東西,剛好你要的東西沒有貨,于是你在店員那里留下了你的電話,過了幾天店里有貨了,店員就打了你的電話,然后你接到電話后就到店里去取了貨。 三、回調(diào)函數(shù)是指 使用者自己定義一個函數(shù),實現(xiàn)這個函數(shù)的程序內(nèi)容,然后把這個函數(shù)(入口地址)作為參數(shù)傳入別人(或系統(tǒng))的函數(shù)中,由別人(或系統(tǒng))的函數(shù)在運行時來調(diào)用的函數(shù)。函數(shù)是你實現(xiàn)的,但由別人(或系統(tǒng))的函數(shù)在運行時通過參數(shù)傳遞的方式調(diào)用,這就是所謂的回調(diào)函數(shù)。簡單來說,就是由別人的函數(shù)運行期間來回調(diào)你實現(xiàn)的函數(shù)。 注:以上解釋均摘自網(wǎng)絡,感謝這些大佬的解釋。
或許到這里你已經(jīng)明白了那么個意思,但是問題來了: 1. 怎么看出來就是一個回調(diào)函數(shù)呢? 2. 怎么定義一個回調(diào)函數(shù)呢? 3. 怎么使用回調(diào)函數(shù)呢? 帶著問題我們看實例,然后再解釋。
第二步:實例解釋
- #include "stdio.h"
- int sub(int a, int b)//求和函數(shù)
- {
- return a+b;
- }
- int mul(int a, int b)//求積函數(shù)
- {
- return a*b;
- }
- int test(int(*p)(int,int), int a, int b)//測試函數(shù)
- {
- return (*p)(a, b);
- }
- void main(void)
- {
- int a = 8;
- int b = 2;
- int temp;
- temp = test(sub, a, b);
- printf("%d\n",temp);
- temp = test(sub, a, b);
- printf("%d\n",temp);
- }
- 執(zhí)行結(jié)果就是
- 10 //8+2
- 16 //8*2
復制代碼主要分析這個test函數(shù),它的三個輸入?yún)?shù)分別是 int(*p)(int, int) int a int b
后面兩個好理解,就是跟常見的一樣,是一個函數(shù)的兩個輸入?yún)?shù)。
第一個要怎么理解呢?
首先看到有*p,這是一個指針了,類比到int *a這種定義方式來理解。 Int temp; //定義一個int型的變量,名稱是temp Int *a;//定義一個 名稱為a的指針這個指針限定的范圍是“int型變量”
那么int(*p)(int, int)它的意思是:定義一個名稱為p的函數(shù)指針, p指向的函數(shù)要求有兩個int輸入?yún)?shù),而且要求這個函數(shù)返回值是int型。
那么趁熱打鐵void(*p)(int, int)的意思就是:定義一個名稱為p的函數(shù)指針, p指向的函數(shù)要求有兩個int輸入?yún)?shù),而且要求這個函數(shù)返回值是void型(即沒有)。
void(*p)(int)的意思就是:定義一個名稱為p的函數(shù)指針, p指向的函數(shù)要求有一個int輸入?yún)?shù),而且要求這個函數(shù)返回值是void型(即沒有)。 char(*p)(int)的意思就是:定義一個名稱為p的函數(shù)指針, p指向的函數(shù)要求有一個int輸入?yún)?shù),而且要求這個函數(shù)返回值是char型。
那么現(xiàn)在有沒有明白這個參數(shù)的定義呢? 有篇資料中有這么一段 『函數(shù)指針的定義比較怪,為什么不是 void ()(int, int, float) *p_func 而是 void(*p_func)(int, int, float) 這種形式?』 這個問題我也不知道,也沒必要糾結(jié),花點時間理解下它與普通指針的區(qū)別,記住這就是它的定義形式。
到這里:總結(jié)一下,上面的這么多都是在解釋一個“函數(shù)指針”。理解了函數(shù)指針,我們再看一下 int test(int(*p)(int,int), int a, int b)//測試函數(shù) { return (*p)(a, b); }
這個test函數(shù)是把 p 這個函數(shù)指針作為一個輸入?yún)?shù)。
temp = test(sub, a, b); 這一句呢,就是把p指向sub這個函數(shù), Sub要求有兩個int輸入?yún)?shù)。
Return (*p)(a,b);就是 Return sub(a,b);這里 *p這個參數(shù)起作用了,這個參數(shù)就是sub函數(shù),就是一個算法。
第三步:疑問解惑現(xiàn)在來回答第一步的三個問題了:
1、 怎么看出來就是一個回調(diào)函數(shù)呢? 像test函數(shù)那樣,用了函數(shù)指針作為輸入?yún)?shù)的函數(shù)就是回調(diào)函數(shù),這種函數(shù)會調(diào)用另外一個函數(shù)作為輸入?yún)?shù)。
2、 怎么定義一個回調(diào)函數(shù)呢? 回調(diào)函數(shù)定義跟上面的識別是反過來的,定義一個函數(shù),它的輸入?yún)?shù)中有函數(shù)指針,那么你就定義了一個回調(diào)函數(shù)。
3、 怎么使用回調(diào)函數(shù)呢? 使用回調(diào)函數(shù)的地方有很多,一般用于封裝的程序給開發(fā)人員留出后期開發(fā)接口。 - int test(int(*p)(int,int), inta, int b)
- {
- Int temp;
- temp = (*p)(a, b);
- if(temp != 0)
- return OK;
- else
- return FAIL;
- }
復制代碼這樣修改test函數(shù),然后封裝起來,test函數(shù)只做結(jié)果是否不為0的判斷,后期開發(fā)人員可以把計算函數(shù)指針,和參與計算的兩個參數(shù)輸入給test,test就能返回OK或者FAIL。雖然這個test函數(shù)已經(jīng)固定了,但后期開發(fā)人員依然可以隨便更改計算函數(shù)。
下面是本文的pdf文檔
回調(diào)函數(shù)的理解.pdf
(445.58 KB, 下載次數(shù): 64)
2019-1-3 14:09 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|