C
Beginner
1 min read
Function Pointers and Callbacks
Example
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* typedef makes function pointer syntax readable */
typedef int (*CompareFunc)(const void *, const void *);
int compare_int_asc(const void *a, const void *b)
{
return (*(const int *)a) - (*(const int *)b);
}
int compare_int_desc(const void *a, const void *b)
{
return (*(const int *)b) - (*(const int *)a);
}
void print_array(const int *arr, int n)
{
for (int i = 0; i < n; i++) printf("%d ", arr[i]);
printf("\n");
}
/* Accepts a callback */
void sort_and_print(int *arr, int n, CompareFunc cmp)
{
qsort(arr, (size_t)n, sizeof(int), cmp);
print_array(arr, n);
}
int main(void)
{
int data[] = {42, 7, 19, 3, 55, 11};
int n = 6;
printf("Ascending: ");
sort_and_print(data, n, compare_int_asc);
printf("Descending: ");
sort_and_print(data, n, compare_int_desc);
/* Array of function pointers — dispatch table */
CompareFunc table[] = { compare_int_asc, compare_int_desc };
int choice = 0; /* 0 = asc, 1 = desc */
int copy[] = {9, 1, 5, 3, 7};
printf("Table[%d]: ", choice);
sort_and_print(copy, 5, table[choice]);
return 0;
}