A function pointer is a pointer value that designates a function. A function name used without a following opening parenthesis undergoes function decay: it becomes a pointer to the function's start. The pointer can then be passed to or invoked by other code. TAKEAWAY: function parameters written as functions are automatically rewritten as function pointers. section 11.4 section 11.5
C permits several equivalent spellings, but typedefs can make interfaces easier to read:
- Assigned and called function pointer types must match exactly; a seemingly compatible parameter list is not enough. section 11.5
Generic sorting with a comparison function
qsort accepts an array base, element count, element size, and a comparison function. The comparison receives two void pointers and must return a strictly negative, positive, or zero result. A comparison for unsigned values can cast those pointers to unsigned const* and compare without subtracting values, because subtraction may overflow. This function-pointer interface lets one sorting routine handle int, double, string, or application-defined element types when the size and comparison contract are correct. section 11.4
typedef void atexit_function(void);
// Two equivalent definitions of the same type, which hides a pointer
typedef atexit_function* atexit_function_pointer;
typedef void (*atexit_function_pointer)(void);
// Five equivalent declarations for the same function
void atexit(void f(void));
void atexit(void (*f)(void));
void atexit(atexit_function f);
void atexit(atexit_function* f);
void atexit(atexit_function_pointer f);
!@%STYLE%@!
{"css":"{\"css\": \"font-weight: bold;\"}","target":"[[{\"line\":0,\"ch\":0},{\"line\":0,\"ch\":12}],[{\"line\":3,\"ch\":0},{\"line\":3,\"ch\":12}],[{\"line\":0,\"ch\":8},{\"line\":0,\"ch\":12}],[{\"line\":3,\"ch\":8},{\"line\":3,\"ch\":12}],[{\"line\":5,\"ch\":0},{\"line\":5,\"ch\":4}],[{\"line\":6,\"ch\":0},{\"line\":6,\"ch\":4}],[{\"line\":7,\"ch\":0},{\"line\":7,\"ch\":4}],[{\"line\":8,\"ch\":0},{\"line\":8,\"ch\":4}],[{\"line\":9,\"ch\":0},{\"line\":9,\"ch\":4}],[{\"line\":0,\"ch\":0},{\"line\":0,\"ch\":7}],[{\"line\":2,\"ch\":0},{\"line\":2,\"ch\":7}],[{\"line\":3,\"ch\":0},{\"line\":3,\"ch\":7}],[{\"line\":0,\"ch\":0},{\"line\":0,\"ch\":12}],[{\"line\":3,\"ch\":0},{\"line\":3,\"ch\":12}],[{\"line\":0,\"ch\":8},{\"line\":0,\"ch\":12}],[{\"line\":3,\"ch\":8},{\"line\":3,\"ch\":12}],[{\"line\":5,\"ch\":0},{\"line\":5,\"ch\":4}],[{\"line\":6,\"ch\":0},{\"line\":6,\"ch\":4}],[{\"line\":7,\"ch\":0},{\"line\":7,\"ch\":4}],[{\"line\":8,\"ch\":0},{\"line\":8,\"ch\":4}],[{\"line\":9,\"ch\":0},{\"line\":9,\"ch\":4}],[{\"line\":0,\"ch\":8},{\"line\":0,\"ch\":12}],[{\"line\":3,\"ch\":8},{\"line\":3,\"ch\":12}],[{\"line\":5,\"ch\":0},{\"line\":5,\"ch\":4}],[{\"line\":6,\"ch\":0},{\"line\":6,\"ch\":4}],[{\"line\":7,\"ch\":0},{\"line\":7,\"ch\":4}],[{\"line\":8,\"ch\":0},{\"line\":8,\"ch\":4}],[{\"line\":9,\"ch\":0},{\"line\":9,\"ch\":4}],[{\"line\":0,\"ch\":13},{\"line\":0,\"ch\":19}],[{\"line\":2,\"ch\":8},{\"line\":2,\"ch\":14}],[{\"line\":3,\"ch\":15},{\"line\":3,\"ch\":21}],[{\"line\":5,\"ch\":5},{\"line\":5,\"ch\":11}],[{\"line\":6,\"ch\":5},{\"line\":6,\"ch\":11}],[{\"line\":7,\"ch\":5},{\"line\":7,\"ch\":11}],[{\"line\":8,\"ch\":5},{\"line\":8,\"ch\":11}],[{\"line\":9,\"ch\":5},{\"line\":9,\"ch\":11}],[{\"line\":0,\"ch\":8},{\"line\":0,\"ch\":12}],[{\"line\":3,\"ch\":8},{\"line\":3,\"ch\":12}],[{\"line\":5,\"ch\":0},{\"line\":5,\"ch\":4}],[{\"line\":6,\"ch\":0},{\"line\":6,\"ch\":4}],[{\"line\":7,\"ch\":0},{\"line\":7,\"ch\":4}],[{\"line\":8,\"ch\":0},{\"line\":8,\"ch\":4}],[{\"line\":9,\"ch\":0},{\"line\":9,\"ch\":4}],[{\"line\":0,\"ch\":8},{\"line\":0,\"ch\":12}],[{\"line\":3,\"ch\":8},{\"line\":3,\"ch\":12}],[{\"line\":5,\"ch\":0},{\"line\":5,\"ch\":4}],[{\"line\":6,\"ch\":0},{\"line\":6,\"ch\":4}],[{\"line\":7,\"ch\":0},{\"line\":7,\"ch\":4}],[{\"line\":8,\"ch\":0},{\"line\":8,\"ch\":4}],[{\"line\":9,\"ch\":0},{\"line\":9,\"ch\":4}],[{\"line\":0,\"ch\":8},{\"line\":0,\"ch\":12}],[{\"line\":3,\"ch\":8},{\"line\":3,\"ch\":12}],[{\"line\":5,\"ch\":0},{\"line\":5,\"ch\":4}],[{\"line\":6,\"ch\":0},{\"line\":6,\"ch\":4}],[{\"line\":7,\"ch\":0},{\"line\":7,\"ch\":4}],[{\"line\":8,\"ch\":0},{\"line\":8,\"ch\":4}],[{\"line\":9,\"ch\":0},{\"line\":9,\"ch\":4}],[{\"line\":0,\"ch\":13},{\"line\":0,\"ch\":19}],[{\"line\":2,\"ch\":8},{\"line\":2,\"ch\":14}],[{\"line\":3,\"ch\":15},{\"line\":3,\"ch\":21}],[{\"line\":5,\"ch\":5},{\"line\":5,\"ch\":11}],[{\"line\":6,\"ch\":5},{\"line\":6,\"ch\":11}],[{\"line\":7,\"ch\":5},{\"line\":7,\"ch\":11}],[{\"line\":8,\"ch\":5},{\"line\":8,\"ch\":11}],[{\"line\":9,\"ch\":5},{\"line\":9,\"ch\":11}],[{\"line\":0,\"ch\":8},{\"line\":0,\"ch\":12}],[{\"line\":3,\"ch\":8},{\"line\":3,\"ch\":12}],[{\"line\":5,\"ch\":0},{\"line\":5,\"ch\":4}],[{\"line\":6,\"ch\":0},{\"line\":6,\"ch\":4}],[{\"line\":7,\"ch\":0},{\"line\":7,\"ch\":4}],[{\"line\":8,\"ch\":0},{\"line\":8,\"ch\":4}],[{\"line\":9,\"ch\":0},{\"line\":9,\"ch\":4}],[{\"line\":0,\"ch\":8},{\"line\":0,\"ch\":12}],[{\"line\":3,\"ch\":8},{\"line\":3,\"ch\":12}],[{\"line\":5,\"ch\":0},{\"line\":5,\"ch\":4}],[{\"line\":6,\"ch\":0},{\"line\":6,\"ch\":4}],[{\"line\":7,\"ch\":0},{\"line\":7,\"ch\":4}],[{\"line\":8,\"ch\":0},{\"line\":8,\"ch\":4}],[{\"line\":9,\"ch\":0},{\"line\":9,\"ch\":4}],[{\"line\":0,\"ch\":8},{\"line\":0,\"ch\":12}],[{\"line\":3,\"ch\":8},{\"line\":3,\"ch\":12}],[{\"line\":5,\"ch\":0},{\"line\":5,\"ch\":4}],[{\"line\":6,\"ch\":0},{\"line\":6,\"ch\":4}],[{\"line\":7,\"ch\":0},{\"line\":7,\"ch\":4}],[{\"line\":8,\"ch\":0},{\"line\":8,\"ch\":4}],[{\"line\":9,\"ch\":0},{\"line\":9,\"ch\":4}],[{\"line\":0,\"ch\":13},{\"line\":0,\"ch\":19}],[{\"line\":2,\"ch\":8},{\"line\":2,\"ch\":14}],[{\"line\":3,\"ch\":15},{\"line\":3,\"ch\":21}],[{\"line\":5,\"ch\":5},{\"line\":5,\"ch\":11}],[{\"line\":6,\"ch\":5},{\"line\":6,\"ch\":11}],[{\"line\":7,\"ch\":5},{\"line\":7,\"ch\":11}],[{\"line\":8,\"ch\":5},{\"line\":8,\"ch\":11}],[{\"line\":9,\"ch\":5},{\"line\":9,\"ch\":11}],[{\"line\":0,\"ch\":8},{\"line\":0,\"ch\":12}],[{\"line\":3,\"ch\":8},{\"line\":3,\"ch\":12}],[{\"line\":5,\"ch\":0},{\"line\":5,\"ch\":4}],[{\"line\":6,\"ch\":0},{\"line\":6,\"ch\":4}],[{\"line\":7,\"ch\":0},{\"line\":7,\"ch\":4}],[{\"line\":8,\"ch\":0},{\"line\":8,\"ch\":4}],[{\"line\":9,\"ch\":0},{\"line\":9,\"ch\":4}],[{\"line\":0,\"ch\":13},{\"line\":0,\"ch\":19}],[{\"line\":2,\"ch\":8},{\"line\":2,\"ch\":14}],[{\"line\":3,\"ch\":15},{\"line\":3,\"ch\":21}],[{\"line\":5,\"ch\":5},{\"line\":5,\"ch\":11}],[{\"line\":6,\"ch\":5},{\"line\":6,\"ch\":11}],[{\"line\":7,\"ch\":5},{\"line\":7,\"ch\":11}],[{\"line\":8,\"ch\":5},{\"line\":8,\"ch\":11}],[{\"line\":9,\"ch\":5},{\"line\":9,\"ch\":11}],[{\"line\":0,\"ch\":8},{\"line\":0,\"ch\":12}],[{\"line\":3,\"ch\":8},{\"line\":3,\"ch\":12}],[{\"line\":5,\"ch\":0},{\"line\":5,\"ch\":4}],[{\"line\":6,\"ch\":0},{\"line\":6,\"ch\":4}],[{\"line\":7,\"ch\":0},{\"line\":7,\"ch\":4}],[{\"line\":8,\"ch\":0},{\"line\":8,\"ch\":4}],[{\"line\":9,\"ch\":0},{\"line\":9,\"ch\":4}],[{\"line\":0,\"ch\":13},{\"line\":0,\"ch\":19}],[{\"line\":2,\"ch\":8},{\"line\":2,\"ch\":14}],[{\"line\":3,\"ch\":15},{\"line\":3,\"ch\":21}],[{\"line\":5,\"ch\":5},{\"line\":5,\"ch\":11}],[{\"line\":6,\"ch\":5},{\"line\":6,\"ch\":11}],[{\"line\":7,\"ch\":5},{\"line\":7,\"ch\":11}],[{\"line\":8,\"ch\":5},{\"line\":8,\"ch\":11}],[{\"line\":9,\"ch\":5},{\"line\":9,\"ch\":11}]]"}
!@%STYLE%@!
Inspect equivalent typedefs and declarations side by side, including the parentheses that distinguish a function pointer from an ordinary function declaration. section 11.4



