Pointers para Functions
Uma function, como uma variável, vive em um endereço — e C deixa você armazenar esse endereço em um pointer. int (*operation)(int, int) declara operation como um pointer para uma function que recebe dois ints e retorna um int; atribuir a ele um nome de function (sem chamá-la) armazena o endereço dessa function.
#include <stdio.h>
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int main() {
int (*operation)(int, int) = add;
printf("%d\n", operation(5, 3));
operation = subtract;
printf("%d\n", operation(5, 3));
return 0;
}8 2
Chamar operation(5, 3) chama qualquer function para a qual operation atualmente aponta — add na primeira vez, subtract depois da reatribuição. É assim que C implementa callbacks e dynamic dispatch sem nenhuma da maquinaria de class ou interface que outras linguagens deste site usam para a mesma ideia.
A seguir: o preprocessor — um passo separado, puramente textual, que roda antes mesmo do compilador ver seu código.
Practice exercise
Escreva as functions add(int,int) e subtract(int,int). Declare um pointer para function inicializado em add, chame-o com (5, 3) e imprima o resultado.