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 retornaa - b. - Declarar um ponteiro para função com a assinatura correta.
- Atribuir o endereço de
subtraiao 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
- Definimos a função
subtraique retorna a diferença entreaeb. - No
main, declaramosint (*ptr)(int, int) = subtrai;. Isso cria um ponteiro para função e o inicializa com o endereço desubtrai. - Chamamos a função indiretamente com
ptr(10, 3), que executasubtrai(10, 3). - Armazenamos o retorno em
resultadoe 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 retornaint*, não um ponteiro para função. Useint (*ptr)(int, int);.- Esquecer de inicializar o ponteiro e tentar chamá-lo causa comportamento indefinido (crash). Sempre atribua antes de usar.
- Chamar
ptrsem 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