當前位置:
首頁 > 知識 > 回調函數的簡單理解及應用

回調函數的簡單理解及應用

前言:本篇文章是我對回調函數的一個簡單的理解,用兩個應用:計算器實現和用冒泡的方式實現qsort函數來解釋什麼是回調函數。

回調函數是什麼

回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。

我的簡單理解:假設現在有兩個函數一個a函數,一個b函數,我們將a函數的地址存在一個函數指針裡邊,傳給b函數,然後b函數通過一些條件對這個函數指針進行使用來調用它所指向的函數,既(a函數),那麼就稱為a函數為回調函數。

使用回調函數實現一個簡單的計算器

#include<stdio.h>

#include<windows.h>

int Add(int x, int y)

{

return x + y;

}

int Mul(int x, int y)

{

return x * y;

}

int Sub(int x, int y)

{

return x - y;

}

int Div(int x, int y)

{

return x / y;

}

void menu()

{

printf("******************************
");

printf("****** 1.Add 2.Mul *******
");

printf("****** 3.Sub 4.Div *******
");

printf("****** 0.Exit ********
");

printf("******************************
");

}

void calc(int (*pcalc)(int ,int))//用一個函數指針接收arr[input]

{

int x = 0;

int y = 0;

int ret = 0;

printf("請輸入兩個操作數:");

scanf_s("%d%d", &x, &y);

ret = pcalc(x, y);

//calc函數通過函數指針調用Add,Mul,Div,Sub函數,這裡就可以認為Add,Mul,Div,Sub是回調函數

//calc這個函數可以計算各種運算,好像變得很通用

printf("ret=%d
", ret);

}

int main()

{

int input = 0;

int(*arr[5])(int, int) = { 0, Add, Mul, Sub, Div };

//arr為一個函數指針數組,這裡多放一個0是為了下標的輸入相匹配

do

{

menu();

printf("請選擇計算類型:");

scanf("%d", &input);

if (input >= 1 && input <= 4)

{

calc(arr[input]);

//arr[input]就是訪問下標為input的函數指針數組的值,拿到的是一個函數指針

}

else if (input != 0)

{

printf("輸入有誤
");

}

else

;

} while (input);

system("pause");

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

使用回調函數和冒泡方式實現qsort函數

#include<stdio.h>

#include<string.h>

#include<windows.h>

int int_cmp(const void*p1, const void*p2)

{

return (*(int*)p1) - (*(int*)p2);

}

//比較函數

void swap(char *e1, char *e2, int width)

{

while (width--)

{

char temp = *e1;

*e1 = *e2;

*e2 = temp;

e1++;

e2++;

}

}

void bubble_sort(void *base, int sz, int width, int(*cmp)(const void *e1, const void *e2))

//用函數指針接收

{

int i = 0;

for (i = 0; i < sz-1; i++)

{

int j = 0;

for (j = 0; j < sz - 1 - i; j++)

{

if (cmp((char *)base + j*width, (char *)base + (j + 1)*width))

//通過函數指針調用函數int_cmp

{

swap((char *)base + j*width, (char *)base + (j + 1)*width ,width);

}

}

}

}

int main()

{

int i = 0;

int arr[] = { 1, 2, 4, 6, 8, 3, 0 };

int sz = sizeof(arr) / sizeof(arr[0]);

bubble_sort(arr, sz, sizeof(int), int_cmp);

//傳參int_cmp為函數的地址,是一個函數指針

for (i = 0; i < sz; i++)

{

printf("%d ", arr[i]);

}

printf("
");

system("pause");

return 0;

}

回調函數的簡單理解及應用

不明飛行物攻擊和綁架人類

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

pgbouncer安裝
hbase查詢解析

TAG:程序員小新人學習 |