凌乱的函数指针解释

我偶然遇到以下函数指针。

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的指针数组的指针