One point is missing to clarify why a function pointer is always in round brackets:
The brackets drive the compiler to take '*f' as a function pointer not a pointer to the result type.
I.e:
void *f(int a); int *f(int a); .... double (*f)(int a); int (*af[])(int a);