当我发现这个声明时,我正在抓取有关函数指针的信息:
char (* ( *f())[])();
我试图找出它的含义但我不能......
它指的是什么?
答案 0 :(得分:5)
分解如下:
f -- f
f() -- is a function returning
*f() -- a pointer to
(*f())[] -- an array of
*(*f())[] -- pointer to
(*(*f())[])() -- function returning
char (*(*f())[])(); -- char
[]
之类的后缀运算符和函数调用()
在*
之类的一元运算符之前绑定,所以
*a[] -- is an array of pointer
(*a)[] -- is a pointer to an array
*f() -- is a function returning a pointer
(*f)() -- is a pointer to a function
找到最左边的标识符并逐步解决,对任何函数参数递归应用这些规则。
修改强>
在对另一个答案的评论中,KerrekSB建议使用typedef,这肯定会使代码扫描更容易:
typedef char CharFunc();
typedef CharFunc *CharFuncPtr;
typedef CharFuncPtr CharFuncPtrArr[N];
typedef CharFuncPtrArr *CharFuncPtrArrPtr;
typedef CharFuncPtrArrPtr CharFuncPtrArrPtrFunc();
CharFuncPtrArrPtrFunc *f;
你可能想出一个更好的命名约定。但即便如此,
CharFuncPtrArrPtrFunc *f;
确保看起来比
更好char (*(*f())[])();
但更好?
根据我的经验,当涉及指针类型时,答案往往是“不”,尤其是。 f
指向什么样的功能?我怎么称呼它?我应该传递给它的参数是什么?如何处理函数f
返回的值?如何在表达式中使用它?我必须查找CharFuncPtrArrPtrFunc
的定义,这意味着我还必须查找CharFuncPtrArrPtr
和CharFuncPtrArr
等的定义,等等,然后我有精神上解决了调用的结果语法。
char (*(*f())[])();
与完全不可读性接壤,但它一眼就告诉我我应该如何调用函数f
指向以及如何使用返回值。
答案 1 :(得分:2)