亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前言

上文分享了一個專用的雙鏈表的基本操作示例:雙鏈表的基本操作

這里提到了一個關(guān)鍵詞:專用。與專用對應(yīng)的詞是通用。我們從字面上可以很容易理解這兩個詞,專用就是針對特定情況的,特點就是很有局限性;通用就是可以針對大多數(shù)情況(更理想的就是所有情況),特點就是適用性廣。

為什么說上篇筆記的雙鏈表是專用的?

C語言、嵌入式重點知識:回調(diào)函數(shù)

 

從我們的定義的元素數(shù)據(jù)類型就可以知道,我們這個雙鏈表是只是用來存儲int類型的數(shù)據(jù)的,這就很能體現(xiàn)出了局限性(這只是其中一點,當然還有其它的很多局限性),因此是個專用的雙鏈表。

我們要編寫一個通用的雙鏈表的話,我們首先要做的是就是修改雙鏈表結(jié)點結(jié)構(gòu)體了,可以修改為:

C語言、嵌入式重點知識:回調(diào)函數(shù)

 

如果我們要存放整數(shù),我們可以把void*強制轉(zhuǎn)換成整數(shù)使用。當然這篇筆記的重點不是分享通用的雙鏈表。我們這篇筆記要分享的是回調(diào)函數(shù),下面進入重點內(nèi)容:

回調(diào)函數(shù)法 VS 常規(guī)法

我們上篇筆記中有一個打印輸出鏈表數(shù)據(jù)的函數(shù):

C語言、嵌入式重點知識:回調(diào)函數(shù)

 

這是我們這個專用的雙鏈表中打印鏈表數(shù)據(jù)函數(shù),我們存儲的是整數(shù),所以用%d打印。那么,如果我們面向的是通用的雙鏈表呢?我們無法預(yù)知其中的數(shù)據(jù),可能是整數(shù),也可能是字符串,或者是其它的數(shù)據(jù)。那么怎么辦呢?這里有幾種方法:

方法一:實現(xiàn)多個函數(shù),需要用到哪個就調(diào)哪個

C語言、嵌入式重點知識:回調(diào)函數(shù)

 

比如存放的是整數(shù),可以調(diào)用dlist_print_int函數(shù)來打印;存放的是字符串,可以調(diào)用dlist_print_string函數(shù)來打印。

這種方法很簡單,但有個缺點:每個函數(shù)都很相似,會有大量重復(fù)的代碼。

 

方法二:傳入一個附加的參數(shù)來選擇打印的方式

C語言、嵌入式重點知識:回調(diào)函數(shù)

 

這種方法使用一個參數(shù)來選擇打印的方式。避免了方法一中產(chǎn)生大量重復(fù)的代碼的問題。但是我們每當要增加新類型時,都得修改這個dlist_print函數(shù),對于一個通用的雙鏈表來說,這樣的修改是不夠好的。這里dlist_print函數(shù)也是通用雙鏈表的一部分,我們應(yīng)該盡量少去修改它。

假如我們把一個通用的雙鏈表的基礎(chǔ)操作比喻做一棟樓房的地基,地基一旦牢牢固固的搭好之后,我們就不要再去動它了, 應(yīng)該把精力放在如何搭建房子的上層上。

 

方法三:回調(diào)函數(shù)法

上面兩種方法應(yīng)該是很容易想到的方法。現(xiàn)在來分享我們可能想不到的方法——回調(diào)函數(shù)法,這也是本篇筆記要分享的重點。

可能有很多朋友沒用過回調(diào)函數(shù),甚至有些朋友都沒聽說過。這里先簡單介紹回調(diào)函數(shù)的一些概念(以下概念來自百度百科):

回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。

回調(diào)函數(shù)不是由該函數(shù)的實現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進行響應(yīng)。

知識點:變量指針指向的是一塊數(shù)據(jù),指針指向不同的變量,則取到的是不同的數(shù)據(jù);函數(shù)指針指向的是一段代碼(即函數(shù)),指針指向不同的函數(shù),則具有不同的行為。

回歸正題,下面看如何使用回調(diào)函數(shù)法來實現(xiàn)上面的需求。

C語言、嵌入式重點知識:回調(diào)函數(shù)

 

首先,我們需要實現(xiàn)一個通用的打印函數(shù)dlist_print,把函數(shù)指針變量作為其中一個參數(shù)傳入。其次,我們調(diào)用者得根據(jù)實際情況實現(xiàn)一個用于打印的回調(diào)函數(shù),這里我們實現(xiàn)的的回調(diào)函數(shù)是dlist_print_int。最后,在用到打印的地方調(diào)用dlist_print函數(shù)即可。

用回調(diào)函數(shù)法是不是很巧妙?

此處,我們用到了typedef來“封裝”一個打印鏈表數(shù)據(jù)的函數(shù)指針類型,這可能會刷新了初學(xué)者對于typedef關(guān)鍵字的認識。因為我們剛開始學(xué)C語言的時候,總認為typedef取別名的一般形式為:

typedef 舊名字 新名字;

確實也是這樣,但遇到給函數(shù)指針類型、數(shù)組類型等定義別名的時候就要特別區(qū)分了。如:

typedef char ARRAY20[20];ARRAY20 a1,a2; /* 等價于char a1[20],a2[20]; */

別問我為什么,就是這樣的。。。

 

回調(diào)函數(shù)的例子

上面分析了那么多,可能很多朋友會覺得回調(diào)函數(shù)太麻煩了,沒必要用。但是現(xiàn)實是,回調(diào)函數(shù)在我們的C編程、嵌入式編程中用得很廣泛。

1、在C編程中

在C語言的通用工具庫stdlib.h中,有如下一個函數(shù)原型:

void qsort(void *, size_t, size_t, int (comp*)(const void *, const void *));

這是在C通用工具庫中聲明的一個快速排序算法函數(shù),其可以用來排序int類型、float類型以及字符串數(shù)據(jù),可以按從小到大的順序也可以按從大到小的順序排序。其關(guān)鍵在于函數(shù)指針comp指向的函數(shù)的具體實現(xiàn)。

 

2、在嵌入式編程中

我們之前的筆記:【RT-Thread筆記】PIN設(shè)備中斷配置中,就有用到回調(diào)函數(shù)。RT-Thread給我們提供了PIN設(shè)備中斷回調(diào)綁定函數(shù):rt_pin_attach_irq

C語言、嵌入式重點知識:回調(diào)函數(shù)

 


C語言、嵌入式重點知識:回調(diào)函數(shù)

 

這是個中斷實驗,產(chǎn)生中斷會回調(diào)我們的回調(diào)函數(shù),所以可以在在我們的回調(diào)函數(shù)里做一些產(chǎn)生中斷后需要做的操作。比如我們在這個中斷回調(diào)里打印一串字符串。每當中斷來時,就會打印該字符串:

C語言、嵌入式重點知識:回調(diào)函數(shù)

 

 

總結(jié)

回調(diào)函數(shù)是一個很重要的知識點,我們需要掌握。而回調(diào)函數(shù)又與函數(shù)指針聯(lián)系密切,我們要努力把函數(shù)指針弄懂、用熟。在C語言中,指針很重要,函數(shù)指針更重要。正如前輩們常說類似這樣子的話:不會C指針,就沒學(xué)會C語言;不會函數(shù)指針,就不要稱自己是C語言高手。

在這幾種方法中的分析中,其實回調(diào)函數(shù)更多的是體現(xiàn)出了軟件分層的思想。分層思想在我們軟件開發(fā)中是一種很重要的思想,簡單的分層我們都會,但是怎么才能算是分層分得很好呢?那就是不該動的地方不動,該動的地方才動,銜接得很好,就像上面的回調(diào)函數(shù)法。

對于編程的學(xué)習(xí),關(guān)于編程語言的學(xué)習(xí),知識點就那么一點,很快就能學(xué)完了,但是真正靈活的、熟練應(yīng)用起來真的是不容易,這需要我們大量地分析、思考、練習(xí)。有時間的話我們也應(yīng)該多讀讀一些關(guān)于軟件設(shè)計思想的書籍,這也是我最近在讀的一類書,學(xué)學(xué)前輩們總結(jié)出的一些精華知識。

以上就是本次關(guān)于回調(diào)函數(shù)的筆記分享,如有錯誤,歡迎指出。

分享到:
標簽:嵌入式 語言
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定