UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

5.8. Punteros a funciones

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