liveBook · Manning

Function pointer type

As explained in Modern C

A function pointer is a pointer value that designates a function and can be passed to or invoked by other code.

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

How Modern C covers it

How deep it goes
Explains decay, declaration syntax, invocation forms, generic callbacks, and exact type matching, with detailed comparison examples.
Examples
Uses atexit declarations, equivalent calls, qsort comparisons, logging tables, and thrd_create callbacks as concrete examples.
What it assumes
Builds from C pointer and array relationships while teaching function decay and function-pointer declarations explicitly.
What you can do after
Apply it via C callback interfaces, typedef readable signatures, implement comparison functions, and select functions through pointer variables or tables.
How it connects
Connects function pointers with pointers, arrays, function parameters, callbacks, qsort, bsearch, logging, and threads.

Also explained in

Compare how 4 books explain function pointer type →

Related concepts

This explainer was generated by Manning's knowledge graph from the text of Modern C. The section links point to the parts of the book it draws on.