这是一句 C / C++ 中“函数指针”的声明,我们拆开来慢慢看就很好理解了 👌
int (*fp)(int a, int b);
👉 fp 是一个指针,指向一个函数
👉 这个函数:
int a, int bint换句话说:
fp可以指向任意一个 形如int func(int, int)的函数
(*fp)?这是重点 ❗
int *fp(int a, int b);
这表示:
fp是一个函数,返回int*(指针)
⚠️ 完全是另一个意思!
int (*fp)(int a, int b);
运算优先级变成:
fp 先是一个 指针📌 括号是为了改变运算优先级
int add(int a, int b) {
return a + b;
}
fp 指向这个函数fp = add;
// 或
fp = &add;
在 C/C++ 中,函数名本身就表示函数地址
int result = fp(3, 4);
// 或
int result = (*fp)(3, 4);
两种写法 完全等价 ✅
void compute(int (*op)(int, int)) {
printf("%d\n", op(2, 3));
}
compute(add);
int sub(int a, int b) { return a - b; }
fp = add;
printf("%d\n", fp(5, 3)); // 8
fp = sub;
printf("%d\n", fp(5, 3)); // 2
int (*ops[2])(int, int) = { add, sub };
ops[0](4, 2); // add
ops[1](4, 2); // sub
从变量名开始,顺时针读
对这句:
int (*fp)(int a, int b);
读法是:
fp是一个指针 → 指向一个函数 → 该函数接收(int, int)→ 返回int
在 C++ 里,很多时候会用:
std::function<int(int, int)> fp;
或 Lambda:
auto fp = [](int a, int b) { return a + b; };
更安全、可读性更好 👍
如果你愿意,我也可以帮你对比:
你现在是在写 C / C++ / 内核 / 嵌入式 哪一块?