回調函數的簡單理解及應用
前言:本篇文章是我對回調函數的一個簡單的理解,用兩個應用:計算器實現和用冒泡的方式實現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;
}
不明飛行物攻擊和綁架人類
TAG:程序員小新人學習 |