Tópicos avançados de C: Ponteiros de funções I

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 = &plus;

	/* Podemos usar a forma curta tambem, como veremos */
	store = (*operation) ( 2, 3);
	printf( "Plus: 2 + 3 = %g\n", store );

	/* O jeito mais curto */
	operation = &minus;
	store = operation( 7, 3);
	printf( "Minus: 7 - 3 = %g\n", store );

	operation = &times;
	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;
}

6 Respostas para “Tópicos avançados de C: Ponteiros de funções I

  1. Pingback: Tópicos avançados de C: Ponteiros de funções II « Aletéia

  2. Priscylla Silva março 31, 2010 às 2:03 pm

    Valeu!
    Sei q o post é antigo, mas to deixando o comentario pq me ajudou bastante. =D

  3. iago setembro 3, 2012 às 7:45 pm

    Muito bom! Me ajudou!

  4. Gustavo Coelho abril 7, 2013 às 2:19 pm

    Muito bom o post cara, meu professor só falou que dava pra fazer e não explicou direito e.e agora saquei melhor 8D

  5. Pingback: Ponteiro para funções | A linguagem C

Deixar mensagem para Priscylla Silva Cancelar resposta