void *vp; double *dp; int *ip; vp = dp; dp = vp; // Ok in C (in C++ requires a cast) vp = ip; ip = vp; dp = ip; // warning, type mismatch dp = (double *) ip; // no warning, but probably unsafe to use dp typedef double (*Func)(double); typedef int (*Gfunc)(void); Func f; // same as: double (*f)(double); Gfunc g; // same as: int (*g)(void); vp = f; // NO, can not store function pointer in void* vp = (void *) f; // NO, can not use cast with function pointer g = f; // NO, type mismatch g = (Gfunc) f; // no warning, but unsafe to use g --- C99 standard: 6.3.2.3 Pointers A pointer to a function of one type may be converted to a pointer to a function of another type and back again; the result shall compare equal to the original pointer. If a converted pointer is used to call a function whose type is not compatible with the pointed-to type, the behavior is undefined. --- 6.5.4 Cast operators - nothing specifically about functions --- J.5 Common extensions The following extensions are widely used in many systems, but are not portable to all implementations. ... J.5.7 Function pointer casts A pointer to an object or to void may be cast to a pointer to a function, allowing data to be invoked as a function (6.5.4). A pointer to a function may be cast to a pointer to an object or to void, allowing a function to be inspected or modified (for example, by a debugger) (6.5.4).