凌乱的函数指针解释

时间:2010-11-05 13:43:30

标签: c++ c function-pointers

我碰巧遇到了以下函数指针。

char (*(*x())[])();

它看起来像一个函数指针数组,格式如下,但我看不出f - > (* x())表示。如何解释这个凌乱的函数指针?

char (*f[])();

ADDED

在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

5 个答案:

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