Messy function pointer interpretation

℡╲_俬逩灬. 提交于 2019-12-04 21:29:09

问题


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.


回答1:


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



回答2:


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:


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



回答4:


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:


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



来源:https://stackoverflow.com/questions/4106362/messy-function-pointer-interpretation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!