回調(diào)函數(shù)是C語言里面一個重要機制。
關(guān)于回調(diào)函數(shù),好多同學(xué)存在一個問題,使用回調(diào)函數(shù)的時候,為什么不需要給函數(shù)傳遞參數(shù)?
比如這樣一個代碼:
#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ù),實現(xiàn)了一個冒泡排序算法,它既能從小到大排序,也能從大到小排序,取決與最后一個參數(shù)。
sort(a,10, greater);
這個參數(shù)既可以是 greater,也可以是 less,很顯然,greater 或者 less 都是一個函數(shù)。
那么問題來了,這個地方使用 greater,為什么不需要給 greater 傳遞兩個參數(shù),寫成這樣:
sort(a,10, greater(1,2));
如果寫成這樣,那就大錯特錯。這個意思是,先調(diào)用 greater,把函數(shù)的返回值作為 sort 的第三個參數(shù),要么是 0 要么 1。
很顯然,這邊要求第三個參數(shù)是指針,傳 0 或者 1 肯定不行。
那使用 greater 函數(shù)的時候,兩個參數(shù)是如何傳過去的?
其實這個地方只需要提供一個地址,就是接下來要調(diào)用的函數(shù)在哪?而函數(shù)名剛好就是函數(shù)的入口地址。
在 sort 函數(shù)內(nèi)部,會通過這個地址來調(diào)用函數(shù),就是這行代碼,不是直接調(diào)用 greater,而是通過函數(shù)指針來調(diào)用,同時給他傳遞了兩個參數(shù)。
如果調(diào)用 sort 的時候,傳遞的是 less,那函數(shù)指針 p 就指向了函數(shù) less,這里就相當(dāng)于間接調(diào)用了 less 函數(shù)。
所以回調(diào)函數(shù)在使用的時候,千萬不能傳參,加上括號,意思就變了。
-
C語言
+關(guān)注
關(guān)注
183文章
7644瀏覽量
145558 -
代碼
+關(guān)注
關(guān)注
30文章
4967瀏覽量
73952 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
95瀏覽量
12195
原文標(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è)計
回調(diào)函數(shù)的詳細(xì)資料說明
為什么不需要給回調(diào)函數(shù)傳遞參數(shù)
評論