Da trilha de C Este conceito ainda não saiu como card do dia. ir para o card de hoje

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 dois int e retorna int.
  • Ponteiros para função são usados como callbacks, permitindo que uma função chame outra passada como argumento.
  • qsort recebe 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 switch extenso.
function_pointers.c
#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;
}

Exercícios

  1. 1
    Fácil

    Ponteiro para função simples

    Crie um programa que declare um ponteiro para função que recebe dois int e retorna int. Atribua a ele a função subtrai e chame-o com os valores 10 e 3, imprimindo o resultado.

    Resolver
  2. 2
    Médio

    Callbacks com qsort

    Escreva um programa que ordene um array de int usando qsort e uma função de comparação que ordene em ordem decrescente. Imprima o array ordenado.

    Resolver
  3. 3
    Desafio

    Tabela de despacho para operações matemáticas

    Implemente uma calculadora simples usando uma tabela de despacho (array de ponteiros para função). O programa deve ler um operador (+, -, *, /) e dois números, e então executar a operação correspondente. Se o operador for inválido, imprima Operador invalido. Para divisão, se o divisor for zero, imprima Erro: divisao por zero.

    Resolver

Continue estudando