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

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

評(píng)論