Curso de C

Ponteiros para Funções

O C permite que acessemos variáveis e funções através de ponteiros! Podemos então fazer coisas como, por exemplo, passar uma função como argumento para outra função. Um ponteiro para uma função tem a seguinte declaração:

tipo_de_retorno (*nome_do_ponteiro)();

ou
tipo_de_retorno (*nome_do_ponteiro)(declaração_de_parâmetros);

Repare nos parênteses que devem ser colocados obrigatoriamente. Se declaramos:

tipo_de_retorno * nome(declaração_de_parâmetros);

Estaríamos, na realidade, declarando uma função que retornaria um ponteiro para o tipo especificado.

Porém, não é obrigatório se declarar os parâmetros da função. Veja um exemplo do uso de ponteiros para funções:

#include <stdio.h>
#include <string.h>
void PrintString (char *str, int (*func)(const char *));
main (void)
{
	char String [20]="Curso de C.";
	int (*p)(const char *);	/* Declaracao do ponteiro para função 
				Funcao apontada e' inteira e recebe como parametro
				uma string constante */
	p=puts;		/* O ponteiro p passa a apontar para a função puts 
			   que tem o seguinte prototipo: int puts(const char *) */
	PrintString (String, p);	/* O ponteiro é passado como parametro para PrintString */
	return 0;
}
void PrintString (char *str, int (*func)(const char *))
{
	(*func)(str);	/* chamada a função através do ponteiro para função */
	func(str);	/* maneira também válida de se fazer a chamada a função puts
			   através do ponteiro para função func  */
}

Veja que fizemos a atribuição de puts a p simplesmente usando:

p = puts;

Disto, concluímos que o nome de uma função (sem os parênteses) é, na realidade, o endereço daquela função! Note, também, as duas formas alternativas de se chamar uma função através de um ponteiro. No programa acima, fizemos esta chamada por:

(*func)(str);

e

func(str);

Estas formas são equivalentes entre si.

Além disto, no programa, a função PrintString() usa uma função qualquer func para imprimir a string na tela. O programador pode então fornecer não só a string mas também a função que será usada para imprimí-la. No main() vemos como podemos atribuir, ao ponteiro para funções p, o endereço da função puts() do C.

Em síntese, ao declarar um ponteiro para função, podemos atribuir a este ponteiro o endereço de uma função e podemos também chamar a função apontada através dele. Não podemos fazer algumas coisas que fazíamos com ponteiros "normais", como, por exemplo, incrementar ou decrementar um ponteiro para função.

Página Anterior Índice da Aula Próxima Página


Curso de C do CPDEE/UFMG - 1996 - 1999