Un puntero a función es una variable que almacena la dirección de una función. Esta función puede ser llamada más tarde, a través del puntero. Este tipo de construcción es útil pues encapsula comportamiento, que puede ser llamado a través de un puntero. Veamos cómo funciona mediante un ejemplo sencillo que crea un puntero a una función de imprimir y lo invoca:
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h>
void imprime()
{
printf("Imprimiendo un message\n");
}
int main()
{
void (*ptr_funct)(void)=imprime;
ptr_funct(); //Llama a imprime
return 0;
} |
Los punteros a funciones también se usan para realizar funciones de retrollamada (callback, en inglés).
El siguiente trozo de código muestra un ejemplo donde una función recibe como paramétro un puntero a función, el cual invoca
cuando ha terminado su ejecución. También muestra las direcciones de memoria que ocupan las funciones, que se imprime con la
opción %p de la función printf.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <stdio.h>
void imprimiendo_hola(int x)
{
printf( "[*HOLA__] Hola número %d\n", x);
}
void imprimiendo_adios(int x, void (*ptr_func)())
{
printf( "[*ADIOS_] Adios número %d\n", x);
if(ptr_func!=NULL)
{
ptr_func(); //Usando el puntero para retrollamar
}
}
void func_call_back()
{
printf( "[*RETRO_] Retrollamada llamada\n");
}
int main()
{ // Definimos dos punteros a funciones
void (*ptr_func_1)(int)=NULL;
void (*ptr_func_2)(int, void (*call_back_func)() )=NULL;
//Usamos el primero
ptr_func_1 = imprimiendo_hola;
printf("[*MAIN__] La dirección del primer puntero is %p\n",ptr_func_1);
ptr_func_1(3);
//Usamos el segundo
ptr_func_2 = imprimiendo_adios;
printf("[*MAIN__] Using a callback función \n",ptr_func_2);
ptr_func_2(3,func_call_back);
return 0;
} |