回調(diào)函數(shù)是C語言里面一個(gè)重要機(jī)制。
關(guān)于回調(diào)函數(shù),好多同學(xué)存在一個(gè)問題,使用回調(diào)函數(shù)的時(shí)候,為什么不需要給函數(shù)傳遞參數(shù)?
比如這樣一個(gè)代碼:
#includevoidsort(inta[],intsize,int(*p)(int,int)) { inti, j; for(i =0; i < size -?1; i++) ? ? { ? ? ? ??for?(j =?0; j < size -?1?- i; j++) ? ? ? ? { ? ? ? ? ? ??if?(p(a[j], a[j +?1])) ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ??int?t = a[j]; ? ? ? ? ? ? ? ? a[j] = a[j +?1]; ? ? ? ? ? ? ? ? a[j +?1] = t; ? ? ? ? ? ? } ? ? ? ? } ? ? } } int?less(int?x,?int?y) { ? ??return?(x > y) ?1:0; } intgreater(intx,inty) { return(x < y) ??1?:?0; } int?main() { ? ??int?a[10] = {1,?0,?4,?7,?2,?9,?5,?3,?8,?6}; ? ??sort(a,?10, greater); ? ??for?(int?i =?0; i 10; i++) ? ? { ? ? ? ??printf("%d ", a[i]); ? ? } ? ??printf(" "); ? ??return?0; }
我們模仿C語言的 qsort 函數(shù),實(shí)現(xiàn)了一個(gè)冒泡排序算法,它既能從小到大排序,也能從大到小排序,取決與最后一個(gè)參數(shù)。
sort(a,10, greater);
這個(gè)參數(shù)既可以是 greater,也可以是 less,很顯然,greater 或者 less 都是一個(gè)函數(shù)。
那么問題來了,這個(gè)地方使用 greater,為什么不需要給 greater 傳遞兩個(gè)參數(shù),寫成這樣:
sort(a,10, greater(1,2));
如果寫成這樣,那就大錯(cuò)特錯(cuò)。這個(gè)意思是,先調(diào)用 greater,把函數(shù)的返回值作為 sort 的第三個(gè)參數(shù),要么是 0 要么 1。
很顯然,這邊要求第三個(gè)參數(shù)是指針,傳 0 或者 1 肯定不行。
那使用 greater 函數(shù)的時(shí)候,兩個(gè)參數(shù)是如何傳過去的?
其實(shí)這個(gè)地方只需要提供一個(gè)地址,就是接下來要調(diào)用的函數(shù)在哪?而函數(shù)名剛好就是函數(shù)的入口地址。
在 sort 函數(shù)內(nèi)部,會通過這個(gè)地址來調(diào)用函數(shù),就是這行代碼,不是直接調(diào)用 greater,而是通過函數(shù)指針來調(diào)用,同時(shí)給他傳遞了兩個(gè)參數(shù)。
如果調(diào)用 sort 的時(shí)候,傳遞的是 less,那函數(shù)指針 p 就指向了函數(shù) less,這里就相當(dāng)于間接調(diào)用了 less 函數(shù)。
所以回調(diào)函數(shù)在使用的時(shí)候,千萬不能傳參,加上括號,意思就變了。
-
C語言
+關(guān)注
關(guān)注
180文章
7628瀏覽量
139945 -
代碼
+關(guān)注
關(guān)注
30文章
4882瀏覽量
70090 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
88瀏覽量
11800
原文標(biāo)題:使用回調(diào)函數(shù),為什么不用傳參數(shù)
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
回調(diào)函數(shù)小結(jié)
請問LWIP中的回調(diào)函數(shù)如何傳遞參數(shù)?
C 語言回調(diào)函數(shù)詳解
ajax回調(diào)方法名使用什么事件,ajax的回調(diào)函數(shù)和匿名函數(shù) 精選資料分享
如何將對象傳遞給BLE回調(diào)函數(shù)?
LabWindows/CVI 程序 回調(diào)函數(shù)設(shè)計(jì)

回調(diào)函數(shù)的詳細(xì)資料說明

評論