如何解读返回函数指针的函数声明

本文详细解析了一个复杂的C++函数指针声明,包括操作符优先级、标识符与操作符的意义以及声明的逐步解读。通过示例代码,展示了如何理解并实现递归声明的函数指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

逐步解读如下代码:

int (*(*pf())())()
{
    return nullptr;
}

首先,要确定声明中出现的操作符的优先级

显然,函数调用操作符()的优先级是高于指针解引用操作符*的,另外,小括号总是具有最高优先级

其次,要确定在声明中标识符与某个操作符结合起来的时候有什么意义

例如:

a()    //a是一个函数
*a     //a是一个指针

由于函数声明的特殊性,当指针解引用操作符*与一个表示函数的标识符结合时,表示这个函数的返回值是一个指针例如 *a() 表示a是一个返回值为指针的函数有了以上的基础,接下来我们就可以从声明中的标识符开始,按照操作符的优先级,由内向外逐步来解读:

/*
       pf()      pf是一个无参数函数
      *pf()      返回值是一个指针
     (*pf())()   返回值是一个无参数函数的指针
    *(*pf())()   返回值是一个无参数函数的指针,这个函数的返回值又是一个指针
   (*(*pf())())()返回值是一个无参数函数的指针,这个函数的返回值又是一个无参数函数的指针
int(*(*pf())())()返回值是一个无参数函数的指针,这个函数的返回值又是一个无参数且返回值为int的函数的指针
*/

可以看出,这实际上是返回值为函数指针的函数的递归声明下面是可读性更强的等效代码:

typedef int (*pa)(); 
typedef pa (*pb)(); 
pb pfex()
{  
    return nullptr; 
}

测试代码:

#include <stdio.h>
#include <conio.h>

int a()
{
    return 88;
}

int (*b())()
{
    return a;
}

int (*(*pf())())()
{
    return b;
}

typedef int (*pa)();
typedef pa (*pb)();

pb pfex()
{
    return b;
}

int main()
{
    int r = pf()()();
    printf("%d\n",r);
    r = pfex()()();
    printf("%d\n",r);
    getch();
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值