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

任何人都可以解释这个int ((*foo(int)))(int)吗?

 int (*fooptr)(int); int ((*foo(int)))(int); // Can't understand what this does. int main() { fooptr = foo(0); fooptr(10); } 

 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 

这是一个很好的解释。

 foo 

是我们宣布的。

 foo(int) 

它是一个带有单个int参数的函数

 *foo(int) 

并返回一个指针

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

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

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

并返回一个int

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

 int (*foo(int))(int) 

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

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

所以这会将bar声明为一个指向函数的指针,该函数接受一个int并返回一个int

 int (*bar)(int); 

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

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

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

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

根据cdecl , foo是:

声明foo为function(int)返回指向function(int)返回int的指针