问题
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