回調函數:我的理解。假設 A是回調函數,B是調用者,B參數裏一個是指向A的函數指針,即回調A,同時另外的參數傳遞給A作爲參數。A可以是多個函數的統一指向,只要函數參數個數相同即可。
WINDOWS回調函數:永遠不會被程序中的其他函數或子程序調用。只能由操作系統調用。因此,windows可以通過傳遞不同參數給回調函數達到和程序溝通的目的。
那麼:B調用A,A也有參數,有參數就要賦值才行。所以B函數內部給A參數賦值。B調用A,A又利用了B給的參數。
A就是回調函數。B就是調用者。
int* func(int params, ...); //這就是指針函數
當一個函數的返回值是一個指針時,該函數就是一個指針函數。
函數代碼是程序的算法指令部分,它們和數組一樣也佔用存儲空間,都有相應的地址。
同比指針變量指向數組首地址,也可以使用指針變量指向函數代碼的首地址,指向函數代碼首地址的指針變量稱爲函數指針。
回調函數參數可以空或者定義成void類型。方便不同類型的數據傳入。通用性強。
int sort_function( const void *a, const void *b); //參數類型是void 兩個參數。傳入參數可以任意類型。更通用。 回調函數的實現,參數也用void。類型由調用者傳的參數決定
/*具體程序如下*/
#include<stdio.h>
// 方法指針的格式爲:int (*ptr)(char *p) 即:返回值(指針名)(參數列表)
typedef int (*CallBackFun)(char *p); // 爲回調函數命名,類型命名爲 CallBackFun,參數爲char *p 。
//下面是兩個被調用者,就是回調函數的實現。回調函數是他們的統一格式。
int Afun(char *p)
{ // 方法 Afun,格式符合 CallBackFun 的格式,因此可以看作是一個 CallBackFun
printf("Afun 回調打印出字符%s!\n", p);
return 0;
}
int Cfun(char *p) { // 方法 Bfun,格式符合 CallBackFun 的格式,因此可以看作是一個 CallBackFun
printf("Cfun 回調打印:%s, Nice to meet you!\n", p);
return 0;
}
/*********************************************************************/
//下面的這些是調用者:有幾種方式,看你喜歡哪種
int call(CallBackFun pCallBack, char *p)
{ // 執行回調函數,方式一:通過命名方式
printf("call 直接打印出字符%s!\n", p);
pCallBack(p);
return 0;
}
/*********************************************************************/
int call2(char *p, int (*ptr)(char*))
{ // 執行回調函數,方式二:直接通過方法指針
printf("==============\n", p);
(*ptr)(p);
}
/*********************************************************************/
int call3(char *p, CallBackFun pCallBack)
{ // 執行回調函數,方式一:通過命名方式
printf("--------------\n", p);
pCallBack(p);
}
/*********************************************************************/
int main()
{
char *p = "hello";
call(Afun, p); //調用Afun回調函數,傳遞參數*P給Afun函數
call(Cfun, p); //調用Cfun回調函數,傳遞參數*P給Afun函數
call2(p, Afun); //調用Afun回調函數,傳遞參數*P給Afun函數
call2(p, Cfun); //調用Cfun回調函數,傳遞參數*P給Afun函數
call3(p, Afun); //調用Afun回調函數,傳遞參數*P給Afun函數
call3(p, Cfun); //調用Cfun回調函數,傳遞參數*P給Afun函數
int i = getchar();
printf("Input: %c \n", i);
return 0;
}
回調函數詳解
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
C語言中的#號和##號的作用
彼方的境界
2018-08-27 18:03:05
C、C++字符操作歸總
彼方的境界
2018-08-27 18:03:00
C++資源之不完全導引(完整版)
scoliver
2018-08-27 13:48:05
User breakpoint called from code at 0x7c92120e
miaoshengwu
2018-08-26 01:22:40
VC之CString,wchar_t,int,string,char*之間的轉換
miaoshengwu
2018-08-26 01:22:38
Unicode下CString(wchar_t)轉換爲 char*
miaoshengwu
2018-08-26 01:22:38
長整型或長double型字符串數據 轉換爲 double
miaoshengwu
2018-08-26 01:22:34
十位以上長整型或double類型數強制轉換爲16進制字符串
miaoshengwu
2018-08-26 01:22:34
十六進制字符串轉換爲十進制數
miaoshengwu
2018-08-26 01:22:34
VC 把數據導出至EXCEL中
miaoshengwu
2018-08-26 01:22:34
STM8彙編 STM8S103F3彙編操作三軸電子指南針HMC5883(I2C接口)
perry_peng
2018-08-25 17:55:52
C語言setsockopt()函數:設置socket狀態
zhangkuo8512067
2018-08-25 09:22:47
goto語句
zhangkuo8512067
2018-08-25 09:22:46
宏定義格式
zhangkuo8512067
2018-08-25 09:22:46
namespace 命名空間
zhangkuo8512067
2018-08-25 09:22:43