You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中函数指针两种调用写法(*b)()和b()的区别是什么

问题相关代码
#include <bits/stdc++.h>
using namespace std;
void test(){
    int a = 100;
    cout << a << endl;
}
int main()
{
    void(*b)() = test;
    (*b)();         //表达式一
    b();            //表达式二
    return 0;
}
两种写法的区别
  • 实际上在C++标准规则下,(*b)()和b()没有任何运行层面的差异,生成的可执行代码完全一致,仅存在写法风格的区别:
    • (*b)()是更早期的C语言遗留写法,显式表达了「对函数指针解引用得到函数后再调用」的逻辑,可读性更强,适合刚接触函数指针的开发者理解逻辑。
    • b()是C、C++标准都支持的简化写法,语法上更简洁,是现在主流的使用风格。
为什么b()可以正常运行

这是C++标准明确规定的语法规则,核心是两类语法设计的支撑:

  1. 函数类型的左值(比如直接使用函数名test)在需要函数指针的场景下,会自动触发函数到指针的隐式转换,直接得到指向该函数的指针,不需要手动取地址。
  2. 函数调用运算符()的操作数本身就支持两种合法类型:
    • 函数类型的左值
    • 指向函数的指针

也就是说你不管是传解引用后的函数左值,还是直接传函数指针,都符合调用运算符的语法要求。甚至你可以写任意层数的解引用,比如(**b)()、(***b)(),都能正常运行,因为每次对函数指针解引用得到函数左值后,只要后续需要指针就会自动转换回来,多层解引用也完全符合规则。

内容的提问来源于stack exchange,提问作者init

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:15:09