use*_*891 14 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);
}
Run Code Online (Sandbox Code Playgroud)
.
hac*_*cks 37
int ((*foo(int)))(int);
Run Code Online (Sandbox Code Playgroud)
这声明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
Run Code Online (Sandbox Code Playgroud)
这是一个很好的解释.
AnT*_*AnT 13
foo
Run Code Online (Sandbox Code Playgroud)
是我们宣布的.
foo(int)
Run Code Online (Sandbox Code Playgroud)
这是一个只需要一个int参数的函数
*foo(int)
Run Code Online (Sandbox Code Playgroud)
并返回一个指针
((*foo(int)))(int)
Run Code Online (Sandbox Code Playgroud)
一个接受一个int参数的函数
int ((*foo(int)))(int)
Run Code Online (Sandbox Code Playgroud)
并返回一个int.
一对()是多余的.同样的事情可以表达为
int (*foo(int))(int)
Run Code Online (Sandbox Code Playgroud)
已经有了答案,但我想以相反的方式接近它.
函数声明看起来与变量声明相同,只是变量名称被函数名称和参数替换.
所以这声明bar为一个指向函数的指针,该函数接受int并返回int:
int (*bar)(int);
Run Code Online (Sandbox Code Playgroud)
如果代替变量bar,它是foo(int)具有该返回值的函数,则替换bar为foo(int)并获取:
int (*foo(int))(int);
// ^^^^^^^^
// this was "bar" before
Run Code Online (Sandbox Code Playgroud)
添加一对不必要的括号,你会得到:
int ((*foo(int)))(int);
// ^ ^
// extra parentheses
Run Code Online (Sandbox Code Playgroud)
根据cdecl,foo是:
声明foo为function(int)返回指向function(int)返回int的指针