回調函數是C語言里面一個重要機制。
關于回調函數,好多同學存在一個問題,使用回調函數的時候,為什么不需要給函數傳遞參數?
比如這樣一個代碼:
#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 函數,實現了一個冒泡排序算法,它既能從小到大排序,也能從大到小排序,取決與最后一個參數。
sort(a,10, greater);
這個參數既可以是 greater,也可以是 less,很顯然,greater 或者 less 都是一個函數。
那么問題來了,這個地方使用 greater,為什么不需要給 greater 傳遞兩個參數,寫成這樣:
sort(a,10, greater(1,2));
如果寫成這樣,那就大錯特錯。這個意思是,先調用 greater,把函數的返回值作為 sort 的第三個參數,要么是 0 要么 1。
很顯然,這邊要求第三個參數是指針,傳 0 或者 1 肯定不行。
那使用 greater 函數的時候,兩個參數是如何傳過去的?
其實這個地方只需要提供一個地址,就是接下來要調用的函數在哪?而函數名剛好就是函數的入口地址。
在 sort 函數內部,會通過這個地址來調用函數,就是這行代碼,不是直接調用 greater,而是通過函數指針來調用,同時給他傳遞了兩個參數。
如果調用 sort 的時候,傳遞的是 less,那函數指針 p 就指向了函數 less,這里就相當于間接調用了 less 函數。
所以回調函數在使用的時候,千萬不能傳參,加上括號,意思就變了。
-
C語言
+關注
關注
180文章
7630瀏覽量
140322 -
代碼
+關注
關注
30文章
4886瀏覽量
70253 -
回調函數
+關注
關注
0文章
88瀏覽量
11825
原文標題:使用回調函數,為什么不用傳參數
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
評論