Declarando ponteiros para funções
Ponteiros para funções.
Declarando ponteiros para funções é uma aula grátis de C Academy no CoddyKit. Esta é a aula 1 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.
As funções têm endereços
Assim como os dados, toda função fica em um endereço na memória. Um ponteiro de função armazena esse endereço para que você possa chamar a função indiretamente.
#include <stdio.h>
void greet(void) { printf("hello\n"); }
int main(void) {
void (*fp)(void) = greet;
fp();
return 0;
}Lendo a declaração
A declaração int (*fp)(int) significa: fp é um ponteiro para uma função que recebe um int e retorna um int.
Os parênteses ao redor de *fp são obrigatórios.
#include <stdio.h>
int square(int x) { return x * x; }
int main(void) {
int (*fp)(int) = square;
printf("%d\n", fp(5));
return 0;
}Atribuindo uma função
O nome de uma função se converte no endereço dela, portanto fp = square e fp = &square são equivalentes.
#include <stdio.h>
int dbl(int x) { return x * 2; }
int main(void) {
int (*fp)(int);
fp = &dbl;
printf("%d\n", fp(7));
return 0;
}Chamando por meio do ponteiro
Você pode chamar uma função por meio de um ponteiro de função com fp(args) ou com a forma explícita (*fp)(args). Ambas fazem a mesma coisa.
#include <stdio.h>
int add1(int x) { return x + 1; }
int main(void) {
int (*fp)(int) = add1;
printf("%d\n", fp(10));
printf("%d\n", (*fp)(10));
return 0;
}A assinatura deve corresponder
O tipo de um ponteiro de função inclui o tipo de retorno e os tipos dos parâmetros. Você só pode atribuir uma função cuja assinatura corresponda exatamente.
#include <stdio.h>
double half(double x) { return x / 2.0; }
int main(void) {
double (*fp)(double) = half;
printf("%f\n", fp(9.0));
return 0;
}Reatribuindo durante a execução
Um ponteiro de função é uma variável, portanto você pode fazê-lo apontar para funções diferentes enquanto o programa é executado.
#include <stdio.h>
int inc(int x) { return x + 1; }
int dec(int x) { return x - 1; }
int main(void) {
int (*op)(int) = inc;
printf("%d\n", op(5));
op = dec;
printf("%d\n", op(5));
return 0;
}Escolhendo por condição
Selecione qual função chamar com base em um valor obtido durante a execução e, em seguida, invoque-a por meio de um único ponteiro.
#include <stdio.h>
int plus(int a) { return a + 10; }
int minus(int a) { return a - 10; }
int main(void) {
int up = 1;
int (*op)(int) = up ? plus : minus;
printf("%d\n", op(100));
return 0;
}typedef para facilitar a leitura
A sintaxe de ponteiros de função é extensa. Um typedef dá um nome ao tipo, tornando as declarações mais claras.
#include <stdio.h>
typedef int (*IntOp)(int);
int triple(int x) { return x * 3; }
int main(void) {
IntOp op = triple;
printf("%d\n", op(4));
return 0;
}Funções com dois argumentos
Ponteiros de função podem descrever qualquer assinatura. Veja aqui um para uma operação binária com inteiros.
#include <stdio.h>
int sum(int a, int b) { return a + b; }
int main(void) {
int (*op)(int, int) = sum;
printf("%d\n", op(3, 4));
return 0;
}Um ponteiro de função nulo
Assim como os ponteiros de dados, um ponteiro de função pode ser NULL. Sempre verifique antes de chamar um que possa não ter sido definido.
#include <stdio.h>
int twice(int x) { return x * 2; }
int main(void) {
int (*op)(int) = NULL;
if (op == NULL) op = twice;
if (op) printf("%d\n", op(8));
return 0;
}Imprimindo o endereço
Você pode examinar o endereço armazenado. Funções diferentes têm endereços diferentes.
#include <stdio.h>
int f(int x) { return x; }
int main(void) {
int (*fp)(int) = f;
printf("function pointer is %s\n", fp ? "set" : "null");
return 0;
}Verificação rápida
Teste sua compreensão sobre declarações de ponteiros de função.
Recapitulação
Você aprendeu a declarar e usar ponteiros de função:
- Sintaxe:
ret (*name)(params), com parênteses obrigatórios. - Atribua usando o nome da função, que se converte em um endereço.
- Chame com
fp(args)ou(*fp)(args). - A assinatura deve corresponder;
typedefmelhora a legibilidade.
Perguntas Frequentes
A aula “Declarando ponteiros para funções” é grátis?
Sim — o texto completo de “Declarando 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 “Declarando ponteiros para funções”?
Ponteiros para funções. 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 1 de 4.
Quanto tempo leva a aula “Declarando 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
- Declarando ponteiros para funções
- Passando funções
- qsort com comparadores
- Tabelas de ponteiros para funções