简体   繁体   中英

Messy function pointer interpretation

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 .

My general procedure is to find the leftmost identifier in the declaration, and then work my way out, remembering that [] and () bind before * (ie, *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;
}
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.

cdecl> explain char (*(*x())[])();
declare x as function returning pointer to array of pointer to function returning char

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();

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM