久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7785|回復: 7
打印 上一主題 下一主題
收起左側(cè)

關于C語言回調(diào)函數(shù)的理解

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:276663 發(fā)表于 2019-1-3 14:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
回調(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ù)呢?
帶著問題我們看實例,然后再解釋。


第二步:實例解釋
  1. #include "stdio.h"
  2. int sub(int a, int b)//求和函數(shù)
  3. {
  4.     return a+b;
  5. }
  6. int mul(int a, int b)//求積函數(shù)
  7. {
  8.     return a*b;
  9. }
  10. int test(int(*p)(int,int), int a, int b)//測試函數(shù)
  11. {
  12.     return (*p)(a, b);
  13. }
  14. void main(void)
  15. {
  16.     int a = 8;
  17.     int b = 2;
  18.     int temp;
  19.     temp = test(sub, a, b);
  20.     printf("%d\n",temp);
  21.     temp = test(sub, a, b);
  22.     printf("%d\n",temp);
  23. }
  24. 執(zhí)行結(jié)果就是
  25. 10     //8+2
  26. 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ā)接口。
  1. int test(int(*p)(int,int), inta, int b)
  2. {
  3.           Int temp;
  4.            temp = (*p)(a, b);
  5.           if(temp != 0)
  6.                    return OK;
  7.           else
  8.                    return FAIL;
  9. }
復制代碼
這樣修改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)


評分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:56636 發(fā)表于 2019-6-21 01:30 | 只看該作者
講的很好,謝謝!
回復

使用道具 舉報

板凳
ID:19959 發(fā)表于 2019-11-23 16:20 | 只看該作者
很好,聽懂了~~~
回復

使用道具 舉報

地板
ID:632854 發(fā)表于 2019-12-18 16:12 | 只看該作者
很好,清晰易懂,謝謝!上面第二步:實例解釋,代碼中第21行temp = test(sub, a, b);應該是筆誤,應該是temp = test(mul, a, b);
回復

使用道具 舉報

5#
ID:276663 發(fā)表于 2020-4-16 09:27 | 只看該作者
williamfang 發(fā)表于 2019-12-18 16:12
很好,清晰易懂,謝謝!上面第二步:實例解釋,代碼中第21行temp = test(sub, a, b);應該是筆誤,應該是tem ...

確實是寫錯了,謝謝提醒,已經(jīng)無法修改了,希望后面讀者注意一下。
回復

使用道具 舉報

6#
ID:477524 發(fā)表于 2020-8-20 14:26 | 只看該作者
很好,清晰易懂!
回復

使用道具 舉報

7#
ID:266876 發(fā)表于 2020-11-17 15:05 | 只看該作者
這幾天剛接觸STM32的HAL庫,剛知道回調(diào)函數(shù),我的理解就是中斷或者別的執(zhí)行的時候,通過函數(shù)指針調(diào)用回調(diào)函數(shù),然后返回,查網(wǎng)上的理解是方便后期開發(fā)人員在調(diào)用的回調(diào)函數(shù)中開發(fā)!但是又冒出新疑問,網(wǎng)上解釋說回調(diào)函數(shù)是并行的,其實回調(diào)函數(shù)與并行與否無關系,僅僅是用了函數(shù)指針,樓主的例子也可以說明,不存在是否并行!那么HAL庫的說法是并行的,那么問題來了,進入中斷后清了中斷標志,假設執(zhí)行回調(diào)函數(shù)的時候,外部又觸發(fā)了中斷咋辦?外面排隊還是又觸發(fā)中斷,理論上說,清了標志位,那就可以再次中斷了~~
回復

使用道具 舉報

8#
ID:58775 發(fā)表于 2020-11-18 11:39 | 只看該作者
剛學了復雜聲明就看到樓主的貼子,很是受益,書上是這么說的,因為函數(shù)不能直接做形參,所以要在形參里調(diào)用函數(shù)時,要用指針的方式。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠操婷婷 | 成人精品| 日韩资源 | 国产午夜精品一区二区三区嫩草 | 久久高清国产视频 | 一区中文字幕 | 久久久精品网站 | 国产一区二区三区 | 伊人狠狠操 | 天天草视频 | 欧美一区二区三区四区视频 | 中文字幕在线观看一区 | 不卡的av在线 | www312aⅴ欧美在线看 | 国产精品一区在线 | 天天天操| 日韩一区二区三区av | 一区天堂 | 中文字幕亚洲欧美日韩在线不卡 | 精品亚洲国产成av人片传媒 | 国产1区2区在线观看 | 亚洲欧美国产精品久久 | 中文字幕在线观看一区 | 日韩波多野结衣 | www.日韩| 91免费看片 | 亚洲乱码国产乱码精品精98午夜 | 成人午夜免费在线视频 | 国产在线精品免费 | 国产在线一区二 | 日本特黄a级高清免费大片 国产精品久久性 | 国产成人在线视频 | 在线视频国产一区 | 一起操网站 | 中文字幕二区 | 日本午夜在线视频 | 精品乱人伦一区二区三区 | 91在线免费视频 | 欧美无乱码久久久免费午夜一区 | 欧美成人精品激情在线观看 | 另类一区 |