逐步解读如下代码:
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;
}