C++如何使用函数指针?(代码示例)

函数指针是存储函数入口地址的变量,用于回调、策略切换等;声明格式为返回类型 (*指针名)(参数列表),可赋函数名或取地址初始化,调用方式同普通函数,常作为参数传递、存入数组或容器,并可用typedef/using简化声明。

函数指针就是指向函数的指针变量,它存储的是函数在内存中的入口地址。用它可实现回调、策略切换、事件分发等灵活逻辑。

声明和初始化函数指针

声明格式:返回类型 (*指针名)(参数列表);注意括号不能省,否则变成函数声明。

例如,有一个加法函数:

int add(int a, int b) {
    return a + b;
}

对应函数指针可以这样声明并初始化:

int (*func_ptr)(int, int) = add;  // 直接赋函数名(不加括号)
// 或显式取地址
int (*func_ptr2)(int, int) = &add;

通过函数指针调用函数

调用方式和普通函数一样,支持两种写法(效果完全相同):

  • func_ptr(3, 5)
  • (*func_ptr)(3, 5)

推荐第一种,更简洁直观。

作为参数传递给其他函数

这是函数指针最常见用途之一,比如实现通用计算函数:

int calc(int x, int y, int (*op)(int, int)) {
    return op(x, y);
}

// 使用 int result = calc(10, 4, add); // 得到 14 int result2 = calc(10, 4, [](int a, int b) { return a * b; }); // C++11 起也可传 lambda(需转成匹配类型)

数组和容器中存多个函数指针

可以定义函数指针数组,实现操作映射表:

int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }

int (*ops[])(int, int) = {add, sub, mul}; int res = ops[1](8, 3); // 调用 sub → 5

也可用 std::vector 存储(需统一类型):

std::vector op_list = {add, sub, mul};

使用 typedef 或 using 简化声明

避免重复写冗长语法:

typedef int (*BinaryOp)(int, int);
// 或 C++11 起推荐
using BinaryOp = int(*)(int, int);

BinaryOp op = add; int r = op(7, 2);