A function pointer stores the address of a function so code can call one operation through a variable.

function pointer `int (*op)(int)` is a pointer to a function that takes and returns an `int`.
callback Passing a function pointer lets another function call back into the selected operation.

Function Pointers

example
function_pointers.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

int doubleValue(int value) {
    return value * 2;
}

int tripleValue(int value) {
    return value * 3;
}

int apply(int value, int (*op)(int)) {
    return op(value);
}

int main(void) {
    int value = 5;
    int useTriple = 0;
    int result = 0;

    if (useTriple) {
        result = apply(value, tripleValue);
    } else {
        result = apply(value, doubleValue);
    }

    printf("result=%d\n", result);
    return 0;
}
#include <stdio.h>

int doubleValue(int value) {
    return value * 2;
}

int tripleValue(int value) {
    return value * 3;
}

int apply(int value, int (*op)(int)) {
    return op(value);
}

int main(void) {
    int value = 4;
    int useTriple = 0;
    int result = 0;

    if (useTriple) {
        result = apply(value, tripleValue);
    } else {
        result = apply(value, doubleValue);
    }

    printf("result=%d\n", result);
    return 0;
}
#include <stdio.h>

int doubleValue(int value) {
    return value * 2;
}

int tripleValue(int value) {
    return value * 3;
}

int apply(int value, int (*op)(int)) {
    return op(value);
}

int main(void) {
    int value = 7;
    int useTriple = 0;
    int result = 0;

    if (useTriple) {
        result = apply(value, tripleValue);
    } else {
        result = apply(value, doubleValue);
    }

    printf("result=%d\n", result);
    return 0;
}
#include <stdio.h>

int doubleValue(int value) {
    return value * 2;
}

int tripleValue(int value) {
    return value * 3;
}

int apply(int value, int (*op)(int)) {
    return op(value);
}

int main(void) {
    int value = 5;
    int useTriple = 1;
    int result = 0;

    if (useTriple) {
        result = apply(value, tripleValue);
    } else {
        result = apply(value, doubleValue);
    }

    printf("result=%d\n", result);
    return 0;
}
  1. value ← 5, useTriple ← 0, result ← 0

    15int main(void) {16    int value→ 5 = 5; //@value=4, 717    int useTriple→ 0 = 0; //@useTriple=118    int result→ 0 = 0;
  2. else

    21    result = apply(value, tripleValue);22} else {23    result0 = apply(value5, doubleValue1);24}
  3. int apply(int value, int (*op)(int))

    11int apply(int value5, int (*op1)(int)) {12    return op(value5);13}
  4. int doubleValue(int value)

    3int doubleValue(int value5) {4    return value5 * 2;5}
  5. result ← 10

    22} else {23    result→ 10 = apply(value5, doubleValue1);24}
  6. printf("result=%d ", result);

    26    printf("result=%d\n", result10);27    return 0;28}
    outputresult=10
  1. value ← 4, useTriple ← 0, result ← 0

    15int main(void) {16    int value→ 4 = 4;17    int useTriple→ 0 = 0;18    int result→ 0 = 0;
  2. else

    21    result = apply(value, tripleValue);22} else {23    result0 = apply(value4, doubleValue1);24}
  3. int apply(int value, int (*op)(int))

    11int apply(int value4, int (*op1)(int)) {12    return op(value4);13}
  4. int doubleValue(int value)

    3int doubleValue(int value4) {4    return value4 * 2;5}
  5. result ← 8

    22} else {23    result→ 8 = apply(value4, doubleValue1);24}
  6. printf("result=%d ", result);

    26    printf("result=%d\n", result8);27    return 0;28}
    outputresult=8
  1. value ← 7, useTriple ← 0, result ← 0

    15int main(void) {16    int value→ 7 = 7;17    int useTriple→ 0 = 0;18    int result→ 0 = 0;
  2. else

    21    result = apply(value, tripleValue);22} else {23    result0 = apply(value7, doubleValue1);24}
  3. int apply(int value, int (*op)(int))

    11int apply(int value7, int (*op1)(int)) {12    return op(value7);13}
  4. int doubleValue(int value)

    3int doubleValue(int value7) {4    return value7 * 2;5}
  5. result ← 14

    22} else {23    result→ 14 = apply(value7, doubleValue1);24}
  6. printf("result=%d ", result);

    26    printf("result=%d\n", result14);27    return 0;28}
    outputresult=14
  1. value ← 5, useTriple ← 1, result ← 0

    15int main(void) {16    int value→ 5 = 5;17    int useTriple→ 1 = 1;18    int result→ 0 = 0;
  2. if (useTriple)

    20if (useTriple1) {21    result0 = apply(value5, tripleValue1);22} else {
  3. int apply(int value, int (*op)(int))

    11int apply(int value5, int (*op1)(int)) {12    return op(value5);13}
  4. int tripleValue(int value)

    7int tripleValue(int value5) {8    return value5 * 3;9}
  5. result ← 15

    20if (useTriple) {21    result→ 15 = apply(value5, tripleValue1);22} else {
  6. printf("result=%d ", result);

    26    printf("result=%d\n", result15);27    return 0;28}
    outputresult=15