liveBook · Manning

Function decay

As explained in Modern C

Function decay is the C conversion in which an expression naming a function is evaluated as a pointer to that function, except in contexts that suppress the conversion.

Function decay converts an expression naming a function into a pointer to that function. A function name without a following opening parenthesis decays to a pointer, enabling function-pointer interfaces. section 11.4

Equivalent calls

For double f(double), f(3), (&f)(3), (*f)(3), (*&f)(3), and (&*f)(3) all call f. The expressions differ only in the sequence of decay, address-of, and dereference operations. section 11.4

Function decay supports several callback patterns:

  • Pass functions to atexit and at_quick_exit. section 11.4
  • Supply comparison functions to bsearch and qsort, allowing generic searching and sorting across element types. section 11.4
  • Store selectable logging functions in function-pointer variables and arrays. 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%@!

Compare equivalent function declarations, typedefs, and pointer-bearing forms. section 11.4

How Modern C covers it

How deep it goes
Defines decay, compares declaration forms, and traces call expressions, while deferring broader pointer details.
Examples
Demonstrates equivalent calls, callback declarations, generic comparison functions, sorting, searching, and selectable logging.
What it assumes
Builds from function declarations and array-decay parallels toward function-pointer syntax and callback usage.
What you can do after
Apply function decay when declaring, passing, storing, and invoking callback functions.
How it connects
Connects function decay with function pointers, array decay, callbacks, bsearch, and qsort.

Also explained in

Compare how 2 books explain function decay →

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.