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; } |