Menu
Coddy logo textTech

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: 2

A 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.

challenge icon

Desafio

Fácil

Vamos 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:

  1. Defina duas funções:
    • add — recebe dois parâmetros int e retorna a soma deles
    • subtract — recebe dois parâmetros int e retorna o primeiro menos o segundo
  2. No main, declare um ponteiro de função chamado calc que possa apontar para funções que recebem dois parâmetros int e retornam um int
  3. Leia quatro entradas: dois números inteiros e dois códigos de operação
  4. 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

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
5

Neste 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: 2

Isso 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;
}
quiz iconTeste seus conhecimentos

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