函数指针之回调函数和转移表
时间: 2023-06-28 19:04:21 浏览: 64
函数指针是一个指向函数的地址的指针。在C语言中,函数指针常用于回调函数和转移表。
一、回调函数
回调函数是一种通过函数指针来实现的函数调用方式,它将一个函数的指针作为参数传递给另一个函数,使得被调用函数可以在需要的时候调用这个指针所指向的函数。回调函数通常用于事件处理、异步调用和扩展程序等场景。下面是一个简单的示例代码:
```C
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
void calc(int (*func)(int, int), int a, int b) {
int result = func(a, b);
printf("result: %d\n", result);
}
int main() {
calc(add, 2, 3); // 输出:result: 5
calc(sub, 5, 2); // 输出:result: 3
return 0;
}
```
在上面的代码中,calc函数接受一个函数指针和两个整数参数,它将传入的函数指针所指向的函数作为参数调用,并将返回值输出到控制台。
二、转移表
转移表是一种将函数指针数组作为参数的编程技巧,它通常用于实现状态机、多路分发等场景。转移表可以将复杂的条件判断简化为数组索引,从而提高程序的可读性和可维护性。下面是一个简单的状态机示例代码:
```C
#include <stdio.h>
typedef enum {
STATE_IDLE,
STATE_READY,
STATE_RUNNING,
STATE_STOPPED
} State;
void idle() {
printf("IDLE\n");
}
void ready() {
printf("READY\n");
}
void running() {
printf("RUNNING\n");
}
void stopped() {
printf("STOPPED\n");
}
void (*state_table[])(void) = {
idle,
ready,
running,
stopped
};
int main() {
State state = STATE_IDLE;
while (1) {
state_table[state]();
// 状态转移
switch (state) {
case STATE_IDLE:
state = STATE_READY;
break;
case STATE_READY:
state = STATE_RUNNING;
break;
case STATE_RUNNING:
state = STATE_STOPPED;
break;
case STATE_STOPPED:
state = STATE_IDLE;
break;
default:
break;
}
}
return 0;
}
```
在上面的代码中,state_table是一个函数指针数组,它包含了所有状态对应的函数指针。程序通过循环遍历state_table数组,并根据当前状态调用相应的函数。在状态转移时,使用switch语句实现简单的状态机逻辑。