Menu
Coddy logo textTech

Declarando Ponteiros para Funções

Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 33 de 61.

Até agora, aprendemos a simular herança usando incorporação de structs. Mas o polimorfismo verdadeiro — onde diferentes objetos respondem de forma diferente à mesma chamada — requer algo mais: function pointers.

Um ponteiro de função é uma variável que armazena o endereço de uma função. Assim como um ponteiro comum contém o endereço de dados, um ponteiro de função contém o endereço de código executável.

A sintaxe pode parecer intimidadora no início. Para declarar um ponteiro de função, você especifica o tipo de retorno, depois o nome do ponteiro entre parênteses com um asterisco, seguido pelos tipos de parâmetros:

int (*operation)(int, int);

Isso declara uma variável chamada operation que pode apontar para qualquer função que receba dois parâmetros int e retorne um int. Os parênteses ao redor de *operation são cruciais — sem eles, você estaria declarando uma função que retorna um ponteiro.

Para atribuir uma função a este ponteiro, basta usar o nome da função (sem parênteses):

int add(int a, int b) {
    return a + b;
}

int (*operation)(int, int);
operation = add;  // Agora operation aponta para add

O nome da função atua como seu endereço. Você também pode usar &add explicitamente, mas é opcional — ambas as formas são equivalentes em C.

challenge icon

Desafio

Fácil

Vamos praticar a declaração de ponteiros de função e a atribuição de funções a eles. Você criará um sistema simples de operação matemática onde um ponteiro de função pode conter diferentes funções aritméticas.

Escreva um programa que:

  1. Defina duas funções:
    • multiply — recebe dois parâmetros int e retorna o produto deles
    • subtract — recebe dois parâmetros int e retorna o primeiro menos o segundo
  2. No main, declare uma variável de ponteiro de função chamada operation que possa apontar para funções que recebem dois parâmetros int e retornam um int
  3. Leia três entradas: dois inteiros e um código de operação (1 para multiply, 2 para subtract)
  4. Com base no código da operação, atribua a função apropriada ao seu ponteiro operation
  5. Imprima o nome da operação atribuída e, em seguida, imprima o resultado da chamada da função por meio do ponteiro

Você receberá três entradas: o primeiro número, o segundo número e o código da operação (1 ou 2).

Sua saída deve ser parecida com esta:

Operation: multiply
Result: 35

Onde multiply é o nome da operação (ou subtract se o código for 2), e 35 é o resultado da chamada da função através do seu ponteiro (neste caso, 5 × 7).

Lembre-se: para declarar o ponteiro de função, você precisa do tipo de retorno, do nome do ponteiro entre parênteses com um asterisco e dos tipos dos parâmetros. Para atribuir uma função, use apenas o nome da função sem parênteses.

Folha de consulta

Um ponteiro de função é uma variável que armazena o endereço de uma função, permitindo o polimorfismo ao possibilitar que diferentes funções sejam chamadas através do mesmo ponteiro.

Declarando um Ponteiro de Função

A sintaxe especifica o tipo de retorno, o nome do ponteiro com asterisco entre parênteses e os tipos de parâmetros:

int (*operation)(int, int);

Isso declara operation como um ponteiro para qualquer função que receba dois parâmetros int e retorne um int. Os parênteses ao redor de *operation são essenciais.

Atribuindo uma Função a um Ponteiro

Use o nome da função sem parênteses:

int add(int a, int b) {
    return a + b;
}

int (*operation)(int, int);
operation = add;  // operation now points to add

O nome da função atua como seu endereço. Você também pode usar &add explicitamente, mas isso é opcional.

Experimente você mesmo

#include <stdio.h>

// TODO: Defina a função de multiplicação aqui


// TODO: Defina a função de subtração aqui


int main() {
    int num1, num2, code;
    
    // Ler entrada
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &code);
    
    // TODO: Declare um ponteiro de função chamado 'operation' que possa apontar para
    // funções que recebem dois parâmetros int e retornam um int
    
    
    // TODO: Com base no código da operação (1 para multiplicar, 2 para subtrair),
    // atribua a função apropriada ao seu ponteiro de operação
    
    
    // TODO: Imprima o nome da operação e o resultado
    // Formato:
    // Operation: <name>
    // Result: <result>
    
    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