int f(int x) { return x + 1; }
int main(int argc, char *argv[]) {
int (*fp)(int) = f;
printf("Answer: %d\n", fp(39) + (****fp)(1));
return 0;
} int f(int x) { return x + 1; }
int main(int argc, char *argv[]) {
int (*fp)(int) = f;
printf("Answer: %d\n", fp(39) + (****fp)(1));
return 0;
}The reason you can chain unlimited ''s is that f isn't actually a function pointer, it's a function designator. Function designators are automatically converted to function pointers in almost every case, but '' is special cased so that indirecting a raw function designator results in another function designator.
Edit: Actually on a closer reading, maybe it does. C89 doesn't explicitly point it out as forbidden or undefined, it simply defines two classes (objects and functions) and only defines a very limited set of valid operations on pointers to functions.
Though one operation that is implementation defined is converting a pointer to an int, and an int to a pointer. So with two steps through an implementation defined path, you have a data pointer to a function.
In some systems functions are smaller, since they're gate addresses in a jump table (who has more than 64k functions?), so that's no problem.
But in some systems functions are bigger, and PCDOS systems running in real mode this was very common, and in those cases you'd need to get the extra bits from someplace else (union trick), or just design things another way.
What are you thinking of?