Passando funções
Callbacks como argumentos.
Passando funções é uma aula grátis de C Academy no CoddyKit. Esta é a aula 2 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.
Funções como argumentos
Como um ponteiro de função é apenas um valor, você pode passar uma função para outra função. A função recebida é chamada de função de retorno.
Isso permite que uma rotina personalize parte do seu comportamento.
#include <stdio.h>
int apply(int x, int (*f)(int)) {
return f(x);
}
int square(int x) { return x * x; }
int main(void) {
printf("%d\n", apply(6, square));
return 0;
}O parâmetro da função de retorno
O parâmetro da função de retorno é declarado assim como uma variável ponteiro de função. Dentro da função, você o chama como qualquer função.
#include <stdio.h>
void run_twice(void (*action)(void)) {
action();
action();
}
void beep(void) { printf("beep\n"); }
int main(void) {
run_twice(beep);
return 0;
}Trocando o comportamento
Passe funções de retorno diferentes para obter resultados diferentes da mesma função de ordem superior.
#include <stdio.h>
int combine(int a, int b, int (*op)(int, int)) {
return op(a, b);
}
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }
int main(void) {
printf("%d\n", combine(3, 4, add));
printf("%d\n", combine(3, 4, mul));
return 0;
}Mapeando um vetor
Uma função map aplica uma função de retorno a cada elemento de um vetor no próprio vetor.
#include <stdio.h>
void map(int *a, int n, int (*f)(int)) {
for (int i = 0; i < n; i++) a[i] = f(a[i]);
}
int inc(int x) { return x + 1; }
int main(void) {
int a[] = {1, 2, 3};
map(a, 3, inc);
for (int i = 0; i < 3; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}Filtrando com um predicado
Um predicado é uma função de retorno que retorna verdadeiro ou falso. Use-o para contar ou selecionar elementos correspondentes.
#include <stdio.h>
int count_if(int *a, int n, int (*pred)(int)) {
int c = 0;
for (int i = 0; i < n; i++) if (pred(a[i])) c++;
return c;
}
int is_even(int x) { return x % 2 == 0; }
int main(void) {
int a[] = {1,2,3,4,5,6};
printf("%d\n", count_if(a, 6, is_even));
return 0;
}Reduzindo a um valor
Uma função de redução transforma um vetor em um único valor usando uma função de retorno binária e um acumulador inicial.
#include <stdio.h>
int reduce(int *a, int n, int init, int (*op)(int,int)) {
int acc = init;
for (int i = 0; i < n; i++) acc = op(acc, a[i]);
return acc;
}
int add(int a, int b) { return a + b; }
int main(void) {
int a[] = {1,2,3,4};
printf("%d\n", reduce(a, 4, 0, add));
return 0;
}Passando uma comparação
A ordenação e a busca geralmente recebem uma função de retorno de comparação para que o mesmo algoritmo funcione com qualquer ordenação.
#include <stdio.h>
int max_by(int a, int b, int (*greater)(int,int)) {
return greater(a, b) ? a : b;
}
int gt(int a, int b) { return a > b; }
int main(void) {
printf("%d\n", max_by(3, 8, gt));
return 0;
}typedef para tipos de funções de retorno
Dar um nome ao tipo da função de retorno com typedef torna as assinaturas de funções legíveis.
#include <stdio.h>
typedef int (*IntFn)(int);
int apply(int x, IntFn f) { return f(x); }
int neg(int x) { return -x; }
int main(void) {
printf("%d\n", apply(5, neg));
return 0;
}Alternativa padrão para a função de retorno
Se uma função de retorno puder ser NULL, forneça um comportamento padrão para que o chamador possa optar por não usá-la.
#include <stdio.h>
int apply(int x, int (*f)(int)) {
if (f == NULL) return x;
return f(x);
}
int dbl(int x) { return x * 2; }
int main(void) {
printf("%d\n", apply(9, NULL));
printf("%d\n", apply(9, dbl));
return 0;
}Funções de retorno desacoplam o código
As funções de retorno permitem que um algoritmo geral permaneça independente da operação específica. A biblioteca fornece o laço; você fornece o comportamento.
#include <stdio.h>
void for_each(int *a, int n, void (*visit)(int)) {
for (int i = 0; i < n; i++) visit(a[i]);
}
void show(int x) { printf("[%d]", x); }
int main(void) {
int a[] = {7, 8, 9};
for_each(a, 3, show);
printf("\n");
return 0;
}Escolhendo a função de retorno durante a execução
Combine a seleção por condição com a passagem: escolha uma função de retorno e depois passe-a para uma função de ordem superior.
#include <stdio.h>
int apply(int x, int (*f)(int)) { return f(x); }
int sq(int x) { return x * x; }
int cube(int x) { return x * x * x; }
int main(void) {
int power = 3;
int (*f)(int) = (power == 2) ? sq : cube;
printf("%d\n", apply(2, f));
return 0;
}Verificação rápida
Teste sua compreensão sobre a passagem de funções.
Recapitulação
Você aprendeu a passar funções como funções de retorno:
- Declare um parâmetro de função de retorno como um ponteiro de função.
- Crie funções de ordem superior, como map, filter, reduce e for_each.
- Use
typedefpara nomear tipos de funções de retorno. - Proteja-se contra funções de retorno
NULLusando um padrão.
Perguntas Frequentes
A aula “Passando funções” é grátis?
Sim — o texto completo de “Passando 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 “Passando funções”?
Callbacks como argumentos. 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 2 de 4.
Quanto tempo leva a aula “Passando 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