凌乱的函数指针解释
我偶然遇到以下函数指针。
char (*(*x())[])();
它看起来像以下格式的函数指针数组,但我看不出f – >(* x())的含义。 如何解释这个凌乱的函数指针?
char (*f[])();
添加
在John Bode的帮助下,我举了一个例子如下。
#include 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 一个 b
而且,您可以在这里找到更好的实现。
我的一般程序是在声明中找到最左边的标识符,然后解决问题,在*
之前记住[]
和()
绑定(即, *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; }
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
使用左右规则将是有益的。
cdecl> explain char (*(*x())[])(); declare x as function returning pointer to array of pointer to function returning char
一些typedef使它更清晰:
typedef char (*charfunc_t)();
这将charfunc_t
定义为一个指向函数的指针,该函数没有返回char
参数。
typedef charfunc_t funcarr_t[];
funcarr_t
是这样的函数指针的数组。
x
是一个返回指向这样一个数组的指针的函数,它现在可以这样声明:
funcarr_t* x();
访问此站点以帮助您理解c声明( cdecl.org ),如果您输入上述内容,它将告诉您这一点
声明x作为函数返回指向函数返回char的指针数组的指针