回撥函式與普通函式呼叫分不清楚?3分鐘幫你搞定!
阿新 • • 發佈:2020-07-14
在剛開始學習函式呼叫時,不少初學者弄不清楚“普通函式呼叫”和“回撥函式”之間的區別,下面做一個簡單的對比分析。
一句話簡單區分:
普通函式呼叫: 函式直接被呼叫
回撥函式: 函式作為引數被呼叫
這樣解釋或許還是不夠直觀,我們直接看例子吧!
普通函式呼叫
#include <stdio.h> // 被呼叫的函式1 int func1(int value) { printf("This is func1,value = %d\n",value); return 0; } // 被呼叫的函式2 int func2(intvalue) { printf("This is func2,value = %d\n",value); return 0; } // 普通函式呼叫 int handle_call_back(int value1,int value2) { func1(value1); // 函式直接被呼叫 func2(value2); // 函式直接被呼叫 return 0; } int main(void) { int a = 66; int b = 88; handle_call_back(a,b); return 0; }
執行結果
This isfunc1,value = 66 This is func2,value = 88
可以看出,這裡普通函式的呼叫,是直接呼叫函式名func1和func2。
不帶參的回撥函式
#include <stdio.h> // 被呼叫的函式1 int call_back1(void) { printf("This is call_back1\n"); return 0; } // 被呼叫的函式2 int call_back2(void) { printf("This is call_back2\n"); return 0; } // 回撥函式 int handle_call_back(int(*call_back)(void)) { call_back(); return 0; } int main(void) { handle_call_back(call_back1); // 函式作為引數被呼叫 handle_call_back(call_back2); // 函式作為引數被呼叫 return 0; }
執行結果
This is call_back1 This is call_back2可以看出,call_back系列函式是作為handle_call_back的引數被呼叫的。上面是不帶引數的回撥函式,那帶參的回撥函式呢?
帶引數的回撥函式
#include <stdio.h> // 被呼叫的函式1 int call_back1(int value1) { printf("This is call_back1,value = %d\n",value1); return 0; } // 被呼叫的函式2 int call_back2(int value2) { printf("This is call_back2,value = %d\n",value2); return 0; } // 回撥函式 int handle_call_back(int value,int (*call_back)(int)) { call_back(value); return 0; } int main(void) { int a = 10; int b = 20; handle_call_back(a,call_back1); // 函式作為引數被呼叫 handle_call_back(b,call_back2); // 函式作為引數被呼叫 return 0; }
執行結果
This is call_back1,value = 10 This is call_back2,value = 20
上面的例子可以看出,handle_call_back中的引數value,可以傳給int (*call_back)(int),實現了帶參回撥函式。