C中这个奇怪的函数指针声明是什么意思?

时间:2015-02-27 21:59:24

标签: c function-pointers

有人可以解释一下这里的int ((*foo(int)))(int)吗?

int (*fooptr)(int);
int ((*foo(int)))(int); // Can't understand what this does.

int main()
{
    fooptr = foo(0);
    fooptr(10);
}

4 个答案:

答案 0 :(得分:37)

int ((*foo(int)))(int);

这将foo声明为需要int类型参数的函数,并返回指向期望int类型参数并返回int的函数的指针。

更清楚:

          foo                           -- foo
        foo(   )                        -- is a function
        foo(int)                         --  taking an int argument
       *foo(int)                          --   returning a pointer
     (*foo(int))(  )                       --   to a function that
    (*foo(int))(int)                        --     takes an int argument
   int (*foo(int))(int)                      --     and returning an int   

Here对此也是一个很好的解释。

答案 1 :(得分:13)

foo

是我们宣布的内容。

foo(int)

这是一个只需要int个参数的函数

*foo(int)

并返回一个指针

((*foo(int)))(int)

到一个带有int个参数的函数

int ((*foo(int)))(int)

并返回int

一对()是多余的。同样的事情可以表示为

int (*foo(int))(int)

答案 2 :(得分:8)

已经有了答案,但我想以相反的方式接近它。

函数声明看起来与变量声明相同,只是变量名称被函数名称​​和参数替换。

因此,这将bar声明为指向函数的指针,该函数接受int并返回int

int (*bar)(int);

如果代替变量bar,它是具有该返回值的函数foo(int),则将bar替换为foo(int)并获取:

int (*foo(int))(int);
//    ^^^^^^^^
// this was "bar" before

添加一对不必要的括号,你得到:

int ((*foo(int)))(int);
//   ^         ^
//  extra parentheses

答案 3 :(得分:6)

根据cdeclfoo是:

  

将foo声明为函数(int),返回指向函数(int)的指针,返回int