C Funções Intermediário
Ponteiros para função
Em C, funções têm endereço de memória. Um ponteiro para função armazena esse endereço e permite chamar a função indiretamente. A sintaxe é tipo_retorno (*nome)(tipos_parametros). Isso possibilita callbacks, tabelas de despacho e o uso de funções genéricas como qsort.
Callbacks são funções passadas como argumento para outras funções, permitindo personalizar comportamento. Por exemplo, qsort da biblioteca padrão recebe um ponteiro para função de comparação, que define a ordenação. Tabelas de despacho (arrays de ponteiros para função) substituem longos switch e facilitam a adição de novos comportamentos.
Neste card, você verá como declarar, atribuir e chamar ponteiros para função, além de aplicá-los em qsort e em uma tabela de despacho simples.
Pontos-chave
- A declaração
int (*f)(int, int);cria um ponteiro para função que recebe doisinte retornaint. - Ponteiros para função são usados como callbacks, permitindo que uma função chame outra passada como argumento.
qsortrecebe um ponteiro para função de comparação para ordenar arrays de qualquer tipo.- Tabelas de despacho são arrays de ponteiros para função que mapeiam índices a operações, evitando
switchextenso.
#include <stdio.h>
#include <stdlib.h>
// Funções que serão apontadas
int soma(int a, int b) { return a + b; }
int multiplica(int a, int b) { return a * b; }
// Callback: recebe um ponteiro para função
void aplicar(int x, int y, int (*op)(int, int)) {
printf("Resultado: %d\n", op(x, y));
}
// Comparação para qsort (crescente)
int compara(const void *a, const void *b) {
int ia = *(const int *)a;
int ib = *(const int *)b;
return (ia > ib) - (ia < ib);
}
int main(void) {
// Declaração e atribuição
int (*ptr)(int, int) = soma;
printf("Soma via ptr: %d\n", ptr(3, 4));
// Callback
aplicar(5, 6, multiplica);
// qsort
int v[] = {5, 2, 9, 1, 7};
int n = sizeof(v) / sizeof(v[0]);
qsort(v, n, sizeof(int), compara);
printf("Ordenado: ");
for (int i = 0; i < n; i++) printf("%d ", v[i]);
printf("\n");
// Tabela de despacho
int (*ops[2])(int, int) = {soma, multiplica};
printf("Tabela[1](2,3) = %d\n", ops[1](2, 3));
return 0;
}