我碰巧遇到了以下函数指针。
char (*(*x())[])();
它看起来像一个函数指针数组,格式如下,但我看不出f - > (* x())表示。如何解释这个凌乱的函数指针?
char (*f[])();
在John Bode的帮助下,我举了一个例子。
#include <stdio.h>
char foo() { return 'a'; }
char bar() { return 'b'; }
char blurga() { return 'c'; }
char bletch() { return 'd'; }
char (*gfunclist[])() = {foo, bar, blurga, bletch};
char (*(*x())[])()
{
static char (*funclist[4])() = {foo, bar, blurga, bletch};
return &funclist;
}
int main()
{
printf("%c\n",gfunclist[0]());
char (*(*fs)[4])();
fs = x();
printf("%c\n",(*fs)[1]());
}
我可以得到预期的结果。
smcho@prosseek temp2> ./a.out a b
而且,您可以找到更好的实施here。
答案 0 :(得分:12)
我的一般程序是在声明中找到最左边的标识符,然后解决问题,记住[]
之前的()
和*
绑定(即*f()
通常将*(f())
解析为*a[]
,*(a[])
通常解析为 x -- x
x() -- is a function
*x() -- returning a pointer
(*x())[] -- to an array
*(*x())[] -- of pointers
(*(*x())[])() -- to functions
char (*(*x())[])(); -- returning char
)。
所以,
char foo() { return 'a'; }
char bar() { return 'b'; }
char blurga() { return 'c'; }
char bletch() { return 'd'; }
/**
* funclist -- funclist
* funclist[] -- is an array
* *funclist[] -- of pointers
* (*funclist[])() -- to functions
* char (*funclist[])() -- returning char
*/
char (*funclist[])() = {foo, bar, blurga, bletch};
这种野兽在实践中会是什么样子?
&funclist
表达式char (*(*x())[])()
{
return &funclist;
}
将返回指向数组的指针,所以
{{1}}
答案 1 :(得分:6)
char (*(*x())[])();
x is a function returning pointer to array of pointer to function returning char
char (*f[])();
在这种情况下f is an array of pointer to function returning char
使用right-left rule将是有益的。
答案 2 :(得分:5)
cdecl> explain char (*(*x())[])();
declare x as function returning pointer to array of pointer to function returning char
答案 3 :(得分:3)
一些typedef使它更清晰:
typedef char (*charfunc_t)();
这将charfunc_t
定义为一个指向函数的指针,该函数没有返回char
的参数。
typedef charfunc_t funcarr_t[];
funcarr_t
是一个这样的函数指针数组。
x
是一个返回指向这样一个数组的指针的函数,它现在可以这样声明:
funcarr_t* x();
答案 4 :(得分:2)
访问此网站以帮助您了解c声明(cdecl.org),如果您输入上述内容,它会告诉您
声明x作为函数返回指向函数返回char的指针数组的指针