Fácil C

Ponteiro para função simples

Enunciado

Crie um programa que declare um ponteiro para função que recebe dois int e retorna int. Atribua a ele a função subtrai e chame-o com os valores 10 e 3, imprimindo o resultado.

Requisitos

  • Declarar int subtrai(int a, int b) que retorna a - b.
  • Declarar um ponteiro para função com a assinatura correta.
  • Atribuir o endereço de subtrai ao ponteiro e chamá-lo.
  • Imprimir o resultado no formato Resultado: 7.

Código inicial

#include <stdio.h>

int subtrai(int a, int b) {
    return a - b;
}

int main(void) {
    // Declare e use o ponteiro para função aqui
    return 0;
}

Saída esperada

Resultado: 7
Ver dica

A declaração do ponteiro deve ser int (*ptr)(int, int);. Atribua ptr = subtrai; e chame ptr(10, 3).

Mostrar solução
#include <stdio.h>

int subtrai(int a, int b) {
    return a - b;
}

int main(void) {
    // Declara ponteiro para função que recebe dois int e retorna int
    int (*ptr)(int, int) = subtrai;
    // Chama a função através do ponteiro
    int resultado = ptr(10, 3);
    printf("Resultado: %d\n", resultado);
    return 0;
}

Passo a passo

  1. Definimos a função subtrai que retorna a diferença entre a e b.
  2. No main, declaramos int (*ptr)(int, int) = subtrai;. Isso cria um ponteiro para função e o inicializa com o endereço de subtrai.
  3. Chamamos a função indiretamente com ptr(10, 3), que executa subtrai(10, 3).
  4. Armazenamos o retorno em resultado e imprimimos.

Por que funciona

O nome da função, sem parênteses, representa o endereço da função. O ponteiro armazena esse endereço e, ao ser chamado com (), o compilador gera uma chamada indireta. Isso é a base para callbacks e tabelas de despacho.

Erros comuns

  • int *ptr(int, int); declara uma função que retorna int*, não um ponteiro para função. Use int (*ptr)(int, int);.
  • Esquecer de inicializar o ponteiro e tentar chamá-lo causa comportamento indefinido (crash). Sempre atribua antes de usar.
  • Chamar ptr sem parênteses (ptr;) não executa a função; é apenas uma expressão que avalia o ponteiro.

Outra forma de resolver

Usar typedef para simplificar:

typedef int (*Operacao)(int, int);
Operacao ptr = subtrai;

Isso é preferível quando o mesmo tipo de ponteiro é usado várias vezes.

Saída esperada

Resultado: 7