Chamando Ponteiros para Funções
Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 34 de 61.
Agora que você sabe como declarar um ponteiro de função e atribuir uma função a ele, o próximo passo é realmente chamar a função através desse ponteiro.
A sintaxe é direta — você usa o ponteiro de função exatamente como chamaria uma função comum:
int add(int a, int b) {
return a + b;
}
int main() {
int (*operation)(int, int) = add;
int result = operation(5, 3); // Chama add(5, 3)
printf("%d\n", result); // Saída: 8
return 0;
}Basta escrever o nome do ponteiro seguido por parênteses contendo os argumentos. O C desreferencia automaticamente o ponteiro e executa a função para a qual ele aponta.
Você também pode usar a sintaxe de desreferência explícita com (*operation)(5, 3), mas é opcional e menos comum. Ambas as formas produzem resultados idênticos.
O verdadeiro poder surge quando você reatribui o ponteiro a diferentes funções:
int subtract(int a, int b) {
return a - b;
}
operation = subtract;
result = operation(5, 3); // Agora chama subtract(5, 3)
printf("%d\n", result); // Saída: 2A mesma variável operation agora executa uma lógica completamente diferente. Essa capacidade de trocar o comportamento em tempo de execução é a base do polimorfismo em C.
Desafio
FácilVamos praticar a chamada de funções por meio de ponteiros e a alternância de qual função é executada. Você construirá uma calculadora simples que pode alternar entre adição e subtração em tempo de execução.
Escreva um programa que:
- Defina duas funções:
add— recebe dois parâmetrosinte retorna a soma delessubtract— recebe dois parâmetrosinte retorna o primeiro menos o segundo
- No
main, declare um ponteiro de função chamadocalcque possa apontar para funções que recebem dois parâmetrosinte retornam umint - Leia quatro entradas: dois números inteiros e dois códigos de operação
- Para cada código de operação:
- Atribua a função apropriada a
calc(1 para add, 2 para subtract) - Chame a função através do ponteiro com os dois números
- Imprima o resultado
- Atribua a função apropriada a
Você receberá quatro entradas: o primeiro número, o segundo número, o primeiro código de operação (1 ou 2) e o segundo código de operação (1 ou 2).
Sua saída deve mostrar dois resultados em linhas separadas — um para cada operação realizada usando os mesmos dois números:
15
5Neste exemplo, com as entradas 10, 5, 1, 2: a primeira operação (código 1) soma 10 + 5 = 15, então o ponteiro é reatribuído, e a segunda operação (código 2) subtrai 10 - 5 = 5.
Isso demonstra como a mesma variável de ponteiro pode executar uma lógica completamente diferente ao reatribuí-la entre as chamadas.
Folha de consulta
Para chamar uma função através de um ponteiro, use o nome do ponteiro seguido por parênteses com os argumentos:
int add(int a, int b) {
return a + b;
}
int main() {
int (*operation)(int, int) = add;
int result = operation(5, 3); // Chama add(5, 3)
printf("%d\n", result); // Saída: 8
return 0;
}Você também pode usar a sintaxe de desreferência explícita (*operation)(5, 3), mas ela é opcional.
Ponteiros de função podem ser reatribuídos para apontar para diferentes funções em tempo de execução:
int subtract(int a, int b) {
return a - b;
}
operation = subtract;
result = operation(5, 3); // Agora chama subtract(5, 3)
printf("%d\n", result); // Saída: 2Isso permite que a mesma variável de ponteiro execute lógicas diferentes ao reatribuí-la entre as chamadas.
Experimente você mesmo
#include <stdio.h>
// TODO: Defina a função add aqui
// TODO: Defina a função subtract aqui
int main() {
// Ler entradas
int num1, num2, op1, op2;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &op1);
scanf("%d", &op2);
// TODO: Declare um ponteiro de função chamado 'calc' que possa apontar para
// funções que recebem dois parâmetros int e retornam um int
// TODO: Para o primeiro código de operação (op1):
// - Atribua a função apropriada para calc (1 para add, 2 para subtract)
// - Chame a função através do ponteiro e imprima o resultado
// TODO: Para o segundo código de operação (op2):
// - Atribua novamente calc para a função apropriada
// - Chame a função através do ponteiro e imprima o resultado
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Object Oriented Programming
1Fundamentos da Programação Modular
Arquivos de CabeçalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta7Ponteiros para Funções
Declarando Ponteiros para FunçõesChamando Ponteiros para FunçõesTypedef para Ponteiros para FunçõesPassando Funções como ArgumentosRecapitulação: Dispatch de Calculadora2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do Círculo