想要全面的了解一個概念,必須至少了解它的三點:它是什么、它有什么用、它在什么時候用。對于回調函數,同樣從三個方面了解它。
1、什么是回調函數?
2、回調函數該如何使用??
3、回調函數在什么情況下使用?
答案一:
回調函數:見名知意,首先肯定的一點是它是一個函數,修飾詞回調指的是程序員自己定義一個函數并實現它的程序內容,然后把這個函數的指針作為參數傳遞給其他函數(如系統函數)中,由其他函數(如系統函數)在運行時調用所實現的函數。函數是程序員自己實現的,但卻是由其他函數(如系統函數)在運行時通過參數傳遞的方式調用的,這就是回調函數。簡單一句話就是:由別人的函數運行期間來回調你實現的函數。
答案二:
示例1:
~~~
#include <stdio.h>
#include <stdlib.h>
int fun1(void)
{
printf("hello world.\n");
return 0;
}
void callback(int (*Pfun)())
{
Pfun();
}
int
main(void)
{
callback(fun1);
}
~~~
callback回調定義的函數fun1,傳遞給callback的是函數fun1的地址。fun1是一個不含參數返回值為整型的函數,如果fun含有參數,還想使用回調函數則可用下面的示例2。
示例2:
~~~
#include <stdio.h>
#include <stdlib.h>
int fun2(char *s)
{
printf("%s.\n", s);
return 0;
}
void callback(int (*Pfun)(char *), char *s)
{
Pfun(s);
}
int
main(void)
{
callback(fun2, "hello world");
return 0;
}
~~~
答案三(引用):
如果想知道回調函數在實際中有什么作用,先假設有這樣一種情況,我們要編寫一個庫,它提供了某些排序算法的實現,如冒泡排序、快速排序、shell排序、shake排序等等,但為使庫更加通用,不想在函數中嵌入排序邏輯,而讓使用者來實現相應的邏輯;或者,想讓庫可用于多種數據類型(int、float、string),此時,該怎么辦呢?可以使用函數指針,并進行回調。
- 前言
- (四)回調函數
- (一)while(1)死循環與for(;;)死循環的區別
- (二)static關鍵字
- (三)函數
- (四)可變參數函數
- (五)setjmp和longjmp
- (六)指針
- (七)回調函數
- (八)字符串
- (九)動態內存分配
- (十)結構體
- (十一)深入理解指針
- (十二)命令行參數
- (十三)printf、fprintf、sprintf和snprintf函數
- (十四)const關鍵字詳解
- (十五)字符串輸入函數fgets、gets和scanf
- (十六)字符串輸出函數puts、fputs和printf
- (十七)字符/字符串輸出函數fputc、fputs、putc、putchar和puts
- (十八)字符/字符串輸入函數fgetc、fgets、getc、getchar和gets
- (十九)restrict關鍵詞
- (二十)scanf函數詳解
- (二一)內聯函數
- (二二)位操作
- (二三)errno變量
- (二四)內存分配