声明的含义是什么" char(*(* f())[])();"?

时间:2014-08-13 10:28:03

标签: c arrays pointers function-pointers

当我发现这个声明时,我正在抓取有关函数指针的信息:

char (* ( *f())[])();

我试图找出它的含义但我不能......

它指的是什么?

2 个答案:

答案 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的定义,这意味着我还必须查找CharFuncPtrArrPtrCharFuncPtrArr等的定义,等等,然后我有精神上解决了调用的结果语法。

char (*(*f())[])();与完全不可读性接壤,但它一眼就告诉我我应该如何调用函数f指向以及如何使用返回值。

答案 1 :(得分:2)