回調函數詳解

回調函數:我的理解。假設   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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章