Functions
Function Pointers
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
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;
}
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;else
21 result = apply(value, tripleValue);22} else {23 result0 = apply(value5, doubleValue1);24}int apply(int value, int (*op)(int))
11int apply(int value5, int (*op1)(int)) {12 return op(value5);13}int doubleValue(int value)
3int doubleValue(int value5) {4 return value5 * 2;5}result ← 10
22} else {23 result→ 10 = apply(value5, doubleValue1);24}printf("result=%d ", result);
26 printf("result=%d\n", result10);27 return 0;28}outputresult=10
value ← 4, useTriple ← 0, result ← 0
15int main(void) {16 int value→ 4 = 4;17 int useTriple→ 0 = 0;18 int result→ 0 = 0;else
21 result = apply(value, tripleValue);22} else {23 result0 = apply(value4, doubleValue1);24}int apply(int value, int (*op)(int))
11int apply(int value4, int (*op1)(int)) {12 return op(value4);13}int doubleValue(int value)
3int doubleValue(int value4) {4 return value4 * 2;5}result ← 8
22} else {23 result→ 8 = apply(value4, doubleValue1);24}printf("result=%d ", result);
26 printf("result=%d\n", result8);27 return 0;28}outputresult=8
value ← 7, useTriple ← 0, result ← 0
15int main(void) {16 int value→ 7 = 7;17 int useTriple→ 0 = 0;18 int result→ 0 = 0;else
21 result = apply(value, tripleValue);22} else {23 result0 = apply(value7, doubleValue1);24}int apply(int value, int (*op)(int))
11int apply(int value7, int (*op1)(int)) {12 return op(value7);13}int doubleValue(int value)
3int doubleValue(int value7) {4 return value7 * 2;5}result ← 14
22} else {23 result→ 14 = apply(value7, doubleValue1);24}printf("result=%d ", result);
26 printf("result=%d\n", result14);27 return 0;28}outputresult=14
value ← 5, useTriple ← 1, result ← 0
15int main(void) {16 int value→ 5 = 5;17 int useTriple→ 1 = 1;18 int result→ 0 = 0;if (useTriple)
20if (useTriple1) {21 result0 = apply(value5, tripleValue1);22} else {int apply(int value, int (*op)(int))
11int apply(int value5, int (*op1)(int)) {12 return op(value5);13}int tripleValue(int value)
7int tripleValue(int value5) {8 return value5 * 3;9}result ← 15
20if (useTriple) {21 result→ 15 = apply(value5, tripleValue1);22} else {printf("result=%d ", result);
26 printf("result=%d\n", result15);27 return 0;28}outputresult=15