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[])();
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.
A function pointer, also called a subroutine pointer or procedure pointer, is a pointer that points to a function. As opposed to referencing a data value, a function pointer points to executable code within memory.
Function pointers are used as callbacks in many cases. One use is as a comparison function in sorting algorithms. So if you are trying to compare customized objects, you can provide a function pointer to the comparison function that knows how to handle that data.
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;
}
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With