I was recently reading a code, and found that a function pointer is written as :
int (*fn_pointer ( this_args ))( this_args )
I usually encounter a function pointer like this :
return_type (*fn_pointer ) (arguments);
Similar thing is discussed here:
// this is a function called functionFactory which receives parameter n
// and returns a pointer to another function which receives two ints
// and it returns another int
int (*functionFactory(int n))(int, int) {
printf("Got parameter %d", n);
int (*functionPtr)(int,int) = &addInt;
return functionPtr;
}
Can somebody tell me what is the difference and how does this work ?
A function pointer is a variable that contains the address of a function. Since it is a pointer variable though with some restricted properties, you can use it pretty much like you would any other pointer variable in data structures.
int (*fn_pointer ( this_args ))( this_args );
declares fn_pointer
as a function that takes this_args
and returns a pointer to a function that takes this_args
as argument and returns an int
type. It is equivalent to
typedef int (*func_ptr)(this_args);
func_ptr fn_pointer(this_args);
Let's understand it a bit more:
int f1(arg1, arg2); // f1 is a function that takes two arguments of type
// arg1 and arg2 and returns an int.
int *f2(arg1, arg2); // f2 is a function that takes two arguments of type
// arg1 and arg2 and returns a pointer to int.
int (*fp)(arg1, arg2); // fp is a pointer to a function that takes two arguments of type
// arg1 and arg2 and returns a pointer to int.
int f3(arg3, int (*fp)(arg1, arg2)); // f3 is a function that takes two arguments of
// type arg3 and a pointer to a function that
// takes two arguments of type arg1 and arg2 and
// returns an int.
int (*f4(arg3))(arg1, arg2); // f4 is a function that takes an arguments of type
// arg3 and returns a pointer to a function that takes two
// arguments of type arg1 and arg2 and returns an int
How to read int (*f4(arg3))(arg1, arg2);
f4 -- f4
f3( ) -- is a function
f3(arg3) -- taking an arg3 argument
*f3(arg3) -- returning a pointer
(*f3(arg3))( ) -- to a function
(*f3(arg3))(arg1, arg2) -- taking arg1 and arg2 parameter
int (*f3(arg3))(arg1, arg2) -- and returning an int
So, finally a home work :). Try to figure out the declaration
void (*signal(int sig, void (*func)(int)))(int);
and use typedef
to redefine it.
From cdecl (which is a handy helper tool to decipher C declarations):
int (*fn_pointer ( this_args1 ))( this_args2 )
declare fn_pointer as function (this_args1) returning pointer to function (this_args2) returning int
Hence the former is a function, that returns pointer to function, while the latter:
return_type (*fn_pointer ) (arguments);
is an ordinary "pointer to function".
Read more about undestanding complex declarations from the Clockwise/Spiral Rule article.
This
int (*fn_pointer ( this_args1 ))( this_args2 )
declares a function that takes as arguments this_args1
and returns a function pointer of type
int (*fn_pointer)(this_args2)
so it's just a function that returns a function pointer.
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