Chamando Ponteiros para Funções
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 34 de 61.
Agora que você sabe como declarar um ponteiro para função e atribuir uma função a ele, o próximo passo é realmente chamar a função por meio desse ponteiro.
A sintaxe é simples. Você usa o ponteiro para função da mesma forma que 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 de parênteses contendo os argumentos. C desreferencia automaticamente o ponteiro e executa a função para a qual ele aponta.
Você também pode usar a sintaxe explícita de desreferência com (*operation)(5, 3), mas ela é opcional e menos comum. As duas 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 troca da função que será executada. Você vai criar uma calculadora simples que pode alternar entre adição e subtração durante a 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
- Em
main, declare um ponteiro para 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 por meio 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 com 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; em seguida, 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 lógicas completamente diferentes ao ser reatribuída entre chamadas.
Experimente você mesmo
#include <stdio.h>
// TODO: Defina a função add aqui
// TODO: Defina a função subtract aqui
int main() {
// Leia as 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 a calc (1 para add, 2 para subtract)
// - Chame a função por meio do ponteiro e imprima o resultado
// TODO: Para o segundo código de operação (op2):
// - Atribua novamente a função apropriada a calc
// - Chame a função por meio 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 Programação Orientada a Objetos
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta7Ponteiros para Funções
Declarando Ponteiros para FunçõesChamando Ponteiros para FunçõesTypedef para Ponteiros para FunçõesPassando Funções como ArgumentosRevisão: Despacho da Calculadora2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online