0Pricing
C Academy · Aula

Tabelas de ponteiros para funções

Padrões de despacho.

Tabelas de ponteiros para funções é uma aula grátis de C Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C Academy inclui 4 aulas no total.

Tabelas de funções

Você pode armazenar ponteiros de função em um vetor para criar uma tabela de despacho. Um índice ou código seleciona qual função executar, substituindo longas sequências de if-else ou switch.

#include <stdio.h>

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }

int main(void) {
    int (*ops[2])(int,int) = { add, sub };
    printf("%d\n", ops[0](5, 3));
    printf("%d\n", ops[1](5, 3));
    return 0;
}

Indexando a tabela

Escolha uma operação durante a execução indexando o vetor. O índice pode vir da entrada do usuário ou do estado do programa.

#include <stdio.h>

int mul(int a, int b) { return a * b; }
int add(int a, int b) { return a + b; }

int main(void) {
    int (*ops[2])(int,int) = { add, mul };
    int choice = 1;
    printf("%d\n", ops[choice](6, 7));
    return 0;
}

Substituindo um switch

Uma tabela de despacho costuma ser mais clara que um switch quando cada caso apenas chama uma função.

#include <stdio.h>

void start(void) { printf("start\n"); }
void stop(void)  { printf("stop\n"); }
void pause(void) { printf("pause\n"); }

int main(void) {
    void (*table[3])(void) = { start, stop, pause };
    for (int i = 0; i < 3; i++) table[i]();
    return 0;
}

typedef organiza a tabela

Usar um typedef para o tipo de ponteiro de função torna a declaração da tabela curta e legível.

#include <stdio.h>

typedef int (*BinOp)(int,int);

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }

int main(void) {
    BinOp ops[] = { add, sub };
    printf("%d\n", ops[0](10, 4));
    return 0;
}

Mapeando símbolos para funções

Associe cada símbolo de operador à sua função em vetores paralelos ou em uma tabela de estruturas para fazer a busca pelo nome.

#include <stdio.h>

typedef int (*BinOp)(int,int);

int add(int a, int b){return a+b;}
int sub(int a, int b){return a-b;}

int main(void) {
    char syms[] = {'+', '-'};
    BinOp ops[] = { add, sub };
    char want = '-';
    for (int i = 0; i < 2; i++)
        if (syms[i] == want) printf("%d\n", ops[i](9, 2));
    return 0;
}

Uma tabela de comandos baseada em estruturas

Agrupe um nome e um manipulador em uma estrutura e depois crie um vetor com eles. Esse é o padrão clássico de tabela de comandos.

#include <stdio.h>
#include <string.h>

typedef struct {
    const char *name;
    void (*run)(void);
} Command;

void hello(void){printf("hi\n");}
void bye(void){printf("bye\n");}

int main(void) {
    Command cmds[] = {{"hello", hello}, {"bye", bye}};
    const char *input = "bye";
    for (int i = 0; i < 2; i++)
        if (strcmp(cmds[i].name, input) == 0) cmds[i].run();
    return 0;
}

Verificação dos limites

Sempre valide o índice antes de chamar uma função por meio da tabela para evitar ler além do vetor.

#include <stdio.h>

typedef int (*Fn)(int);
int sq(int x){return x*x;}
int neg(int x){return -x;}

int main(void) {
    Fn table[] = { sq, neg };
    int n = 2;
    int idx = 5;
    if (idx >= 0 && idx < n) printf("%d\n", table[idx](3));
    else printf("index out of range\n");
    return 0;
}

Máquinas de estados

Tabelas de despacho controlam máquinas de estados: cada estado é representado por um ponteiro de função, e os manipuladores retornam o índice do próximo estado.

#include <stdio.h>

int state_a(void){ printf("A\n"); return 1; }
int state_b(void){ printf("B\n"); return -1; }

int main(void) {
    int (*states[2])(void) = { state_a, state_b };
    int s = 0;
    while (s >= 0) s = states[s]();
    return 0;
}

Despacho semelhante a plug-ins

Ao registrar manipuladores em uma tabela, você pode adicionar novos comportamentos acrescentando uma entrada, em vez de editar um switch grande.

#include <stdio.h>

typedef void (*Handler)(int);
void log_low(int v){printf("low %d\n", v);}
void log_high(int v){printf("high %d\n", v);}

int main(void) {
    Handler handlers[] = { log_low, log_high };
    int level = 1;
    handlers[level](7);
    return 0;
}

Manipulador padrão

Reserve uma posição ou um ponteiro alternativo para códigos desconhecidos, para que o despacho nunca falhe silenciosamente.

#include <stdio.h>

typedef void (*Fn)(void);
void known(void){printf("known\n");}
void fallback(void){printf("unknown command\n");}

int main(void) {
    Fn table[] = { known };
    int n = 1, code = 9;
    Fn f = (code >= 0 && code < n) ? table[code] : fallback;
    f();
    return 0;
}

Por que as tabelas são escaláveis

As tabelas de despacho transformam a lógica de ramificação em uma busca de dados. Adicionar casos significa adicionar dados, o que mantém o código linear e rápido.

#include <stdio.h>

typedef int (*Fn)(int);
int a(int x){return x+1;}
int b(int x){return x*2;}
int c(int x){return x*x;}

int main(void) {
    Fn t[] = { a, b, c };
    for (int i = 0; i < 3; i++) printf("%d ", t[i](4));
    printf("\n");
    return 0;
}

Verificação rápida

Teste sua compreensão sobre tabelas de ponteiros de função.

Recapitulação

Você aprendeu padrões de despacho com tabelas de ponteiros de função:

  • Armazene ponteiros de função em um vetor e selecione-os pelo índice.
  • Eles substituem longas sequências de switch e escalam com a adição de dados.
  • Use typedef e tabelas de comandos com estruturas para obter clareza.
  • Sempre verifique os limites do índice e forneça um manipulador padrão.

Perguntas Frequentes

A aula “Tabelas de ponteiros para funções” é grátis?

Sim — o texto completo de “Tabelas de ponteiros para funções” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C Academy, atualize para CoddyKit PRO. O curso de C Academy inclui 4 aulas no total.

O que vou aprender em “Tabelas de ponteiros para funções”?

Padrões de despacho. Você pratica C Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C Academy?

Nenhuma experiência prévia é necessária. C Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Tabelas de ponteiros para funções”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C Academy?

Sim. Cada aula de C Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Declarando ponteiros para funções
  2. Passando funções
  3. qsort com comparadores
  4. Tabelas de ponteiros para funções
← Voltar para C Academy