thinking in terms of memory occupation helps a lot. You have:
Code:
typedef struct
{
int foo; // this is an integer, i.e. 4 bytes
// this is a pointer, thus a long, i.e. 4 bytes too.
int (*fooFunc) (int *param1, int *param2);
} my_func_t;
fooFunc is a pointer, which means, no matter how many trailing parameters you put on that line to the fooFunc function, its representation will be identical in every instance of the struct: 4 bytes, filled with the address of the function you will be calling.
With this:
Code:
callerFunc->fooFunc = MyCoolFunc(12, 13);
you are not storing the address of MyCoolFunc and its parameters, you are CALLING MyCoolFunc() with 12 and 13 as parameters, and storing... its return value.
That's not quite the same thing!