Messy function pointer interpretation

2020-06-17 05:35发布

I happen to come across the following function pointer.

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

It looks like an array of function pointer in the following format, but I can't see what f -> (*x()) means. How to interpret this messy function pointer?

char (*f[])();

ADDED

With John Bode's help, I make an example as follows.

#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]()); 
}

I could get the expected result.

smcho@prosseek temp2> ./a.out 
a
b

And, you can find a better implementation here.

5条回答
孤傲高冷的网名
2楼-- · 2020-06-17 05:47
char (*(*x())[])();

x is a function returning pointer to array of pointer to function returning char

char (*f[])();

In this case f is an array of pointer to function returning char

Using the right-left rule would be beneficial.

查看更多
够拽才男人
3楼-- · 2020-06-17 05:54

My general procedure is to find the leftmost identifier in the declaration, and then work my way out, remembering that [] and () bind before * (i.e., *f() is normally parsed as *(f()) and *a[] is normally parsed as *(a[])).

So,

          x           -- x
          x()         -- is a function
         *x()         -- returning a pointer
        (*x())[]      -- to an array
       *(*x())[]      -- of pointers
      (*(*x())[])()   -- to functions
 char (*(*x())[])();  -- returning char

What would such a beast look like in practice?

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};

The expression &funclist will return a pointer to the array, so

char (*(*x())[])()
{
  return &funclist;
}
查看更多
Ridiculous、
4楼-- · 2020-06-17 05:57

A few typedefs make it clearer:

typedef char (*charfunc_t)();

This defines charfunc_t to be a pointer to a function without arguments that returns char.

typedef charfunc_t funcarr_t[];

funcarr_t is an array of such function pointers.

x is a function returning a pointer to such an array and it can now be declared like this:

funcarr_t* x();
查看更多
虎瘦雄心在
5楼-- · 2020-06-17 05:58

Visit this site to help you understand c declarations (cdecl.org), if you type the above in, it will tell you this

declare x as function returning pointer to array of pointer to function returning char

查看更多
ゆ 、 Hurt°
6楼-- · 2020-06-17 06:01
cdecl> explain char (*(*x())[])();
declare x as function returning pointer to array of pointer to function returning char
查看更多
登录 后发表回答