在剛開始學習函數調用時,不少初學者弄不清楚“普通函數調用”和“回調函數”之間的區別,下面做一個簡單的對比分析。
一句話簡單區分:
普通函數調用: 函數直接被調用
回調函數: 函數作為參數被調用
這樣解釋或許還是不夠直觀,我們直接看例子吧!
普通函數調用
#include <stdio.h> // 被調用的函數1 int func1(int value) { printf("This is func1,value = %d\n",value); return 0; } // 被調用的函數2 int func2(int value) { 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 is func1,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),實現了帶參回調函數。
