C - Pointing to functions
Overview
Function pointers store the address of a function, enabling callbacks and flexible APIs.
Learning Objectives
- Declare and use function pointers.
- Use typedefto simplify function pointer syntax.
- Pass function pointers as callbacks (e.g., to qsort).
Prerequisites
Basics
#include <stdio.h>
int add(int a, int b) { return a + b; }
int main(void) {
  int (*op)(int,int) = &add;   // function pointer
  printf("%d\n", op(2,3));     // 5
}
Using typedef
typedef int (*binop)(int,int);
int add(int a, int b) { return a + b; }
int main(void) {
  binop op = add;              // & is optional
  printf("%d\n", op(2,3));
}
Callback example with qsort
#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void *a, const void *b) {
  int ia = *(const int*)a, ib = *(const int*)b;
  return (ia > ib) - (ia < ib);
}
int main(void) {
  int v[] = {4,1,3,2};
  size_t n = sizeof v / sizeof v[0];
  qsort(v, n, sizeof v[0], cmp_int);
  for (size_t i = 0; i < n; i++) printf("%d ", v[i]);
  printf("\n");
}
Common Pitfalls
- Mismatch between function signature and pointer type.
- Forgetting const-correctness in comparator callbacks.
Checks for Understanding
- How do you declare a pointer to a function int f(double)?
Show answer
int (*pf)(double);
Expected Output
- Basics: 5
- typedef: 5
- qsort: 1 2 3 4
Practical Example: Dispatch Table
#include <stdio.h>
int add(int a,int b){ return a+b; }
int sub(int a,int b){ return a-b; }
int mul(int a,int b){ return a*b; }
typedef int (*op)(int,int);
int main(void){
  op ops[3] = { add, sub, mul };
  printf("%d %d %d\n", ops[0](7,3), ops[1](7,3), ops[2](7,3));
}
Expected Output: 10 4 21
Exercises
- Define a comparator for qsortthat sorts integers in descending order.
- Build a small calculator using a table of function pointers keyed by an operator char.