C与指针-第十三章-函数指针

本文重点讲的函数指针为 回调函数和转移表。

回调函数

含义:

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

机制:

⑴定义一个回调函数;
⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

举例:

1.我们在路上遇到一个好多年没见到的朋友,要了朋友的手机好,跟他说我回去打给你

1)遇见朋友–主函数
2)我打电话给朋友,通过朋友的手机号,找到朋友–(回调)

2.寄快递的情形
打电话给快递员,告诉他我的地址(理解成回调函数的地址),快递员在有空的时候根据这个地址来找到你取件。

1)打电话给快递员,告诉他我的地址–主函数(我的地址–回调函数地址)
2)快递员处理完其他事情后,通过这个地址(回调)来找到你取件,执行完回调里面的内容。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*回调函数*/
void *call_phone_number(int number )
{
printf("phone number = %d\n",number); /*通过号码找到朋友*/
}

/*调用函数*/
void start_call( void *call_back(int number))
{

int phone_number = 12345;
call_back(phone_number);
}

int main(void)
{

start_call(call_phone_number);
return 0;
}

转移表

用函数指针的形式来替换switch、if/else的方式

示例:

一个计算器实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
double add(double,double);
double sub(double,double);
double mul(double,double);
double div(double,double);

switch(oper)
{
case ADD:
result = add(op1mop2);
break;
case SUB:
result = sub(op1mop2);
break;
case MUL:
result = mul(op1mop2);
break;
case DIV:
result = div(op1mop2);
break;
default:
break;
}

上述代码改成转移表只需要两个步骤。
首先,声明并初始化一个函数指针数组。

1
2
3
4
double (*oper_func[])(double,double)={add,sub,mil,div};

调用:
result = oper_func[oper](op1,op2);

oper从数组中选择正确的函数指针,而函数调用操作符将执行这个函数

Tianger Ge wechat
如果您喜欢这篇文章,欢迎扫一扫我的微信公众号!