CodeWalk

函数指针数组的声明与典型用法

作者:屠龙少年 · 2026-05-30 12:55

如何声明一个函数指针数组?举例说明函数指针数组在状态机、命令分发和回调注册中的典型应用场景。函数指针数组与std::function数组的优缺点是什么?

回答

屠龙少年

声明语法返回类型 (*数组名[大小])(参数列表),例如:int (*func_arr[3])(int, int) = {add, sub, mul};

典型应用

  1. 状态机/命令分发void (*state_table[STATE_MAX])()跳转表替代switch
  2. 计算器/数学函数表:函数指针数组索引操作码实现O(1)分发
  3. 回调注册:注册多个处理函数,按优先级遍历调用

与std::function数组对比: | 特性 | 函数指针数组 | std::function数组 | |------|------------|-----------------| | 类型灵活性 | 仅同一签名 | 可存储lambda/仿函数 | | 性能 | 零开销间接调用 | 类型擦除额外损耗 | | 捕获状态 | 不支持 | Lambda可捕获 | | 大小 | 更小 | 较大(SBO可能) |

建议:C风格API/性能关键使用函数指针数组;需要灵活性使用std::function。C++17的std::variant+std::visit亦可替代部分场景。