Antes de começarmos, crie um arquivo .h com o seguinte conteúdo (chameio de c-funcpointer.h):
float plus( float a, float b)
{
return (a + b);
}
float minus( float a, float b)
{
return (a - b);
}
float times( float a, float b)
{
return (a * b);
}
float division( float a, float b)
{
return (a / b);
}
Eu sei que essa não é a forma mais correta de se usar um cabeçalho, mas como vamos utilizar esse código algumas vezes, e ainda não entrei em bibliotecas estáticas (.a), faremos assim. Esse cabeçalho define quatro funções simples, as quatro operações matemáticas mais simples, aceitando dois floats como argumento e retornando outro float.
Nesse primeiro exemplo, veremos o básico: declaração de ponteiros de funções e como usá-los diretamente.
Quando queremos um ponteiro de um determinado tipo de variável, basta acrescentar um *.
float var;
float *ptr = NULL;
Então para termos um ponteiro de funções, basta adicionar um *, certo? Bom, nem tanto.
float *func( float, float );
Define uma função que retorna um ponteiro para um float. Para definirmos um ponteiro, devemos fazer assim:
float (*func) ( float, float );
Podemos também fazer um ponteiro para uma função que retorna um ponteiro, assim:
float* (*func) ( float, float );
Agora vejamos como se usa isso. Esse ponteiro recém-declarado funciona exatamente como um ponteiro qualquer, basta atribuir-lhe o endereço de uma função:
float (*fptr) ( float, float );
fptr = +
fptr = minus; /* também funciona, mas não é modo correto */
E agora é só usá-lo como uma função normal:
var = (*fptr) ( 2, 3); /* ou */
var = fptr( 2, 3 );
Um exemplo funcional (não se esqueça do cabeçalho que foi mostrado no início do artigo):
#include <stdio.h>
#include <stdlib.h>
#include "c-funcpointer.h"
/* E assim que se define o ponteiro para uma função */
float (*operation)( float, float ) = NULL;
int main( int argc, char *argv[] )
{
float store;
operation = +
/* Podemos usar a forma curta tambem, como veremos */
store = (*operation) ( 2, 3);
printf( "Plus: 2 + 3 = %g\n", store );
/* O jeito mais curto */
operation = −
store = operation( 7, 3);
printf( "Minus: 7 - 3 = %g\n", store );
operation = ×
store = operation( 4, 2);
printf( "Times: 4 * 2 = %g\n", store );
operation = &division;
store = operation( 6, 2);
printf( "Division: 6 / 2 = %g\n", store );
return 0;
}
Pingback: Tópicos avançados de C: Ponteiros de funções II « Aletéia
Valeu!
Sei q o post é antigo, mas to deixando o comentario pq me ajudou bastante. =D
Post interessantissimo. Foi de grande ajuda.
Abraço. :-*
Muito bom! Me ajudou!
Muito bom o post cara, meu professor só falou que dava pra fazer e não explicou direito e.e agora saquei melhor 8D
Pingback: Ponteiro para funções | A linguagem C