4.c – Punteros a Función

Los punteros a funciones en C son punteros que apuntan a direcciones de memoria de funciones en lugar de apuntar a datos o variables. Esto permite que se pueda invocar funciones de manera dinámica en tiempo de ejecución a través de punteros.

Un puntero a función se declara con una sintaxis que se asemeja a la declaración de una función, y se utiliza para apuntar a una función que tenga la misma firma o tipo de retorno que se ha especificado en la declaración del puntero a función.

La idea es utilizar punteros a función es para implementar conceptos de “polimorfismo” donde diferentes objetos pueden tener funciones con la misma firma y comportamiento diferente. Estos punteros se utilizan para elegir qué función se debe llamar en tiempo de ejecución, lo que permite la implementación de la herencia y la extensión de clases. Además en algunas situaciones, el uso de punteros a funciones puede llevar a una mejor optimización del código, ya que el compilador puede generar un código más eficiente al llamar a funciones a través de punteros en lugar de usar llamadas directas a funciones.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
    int dni;
    char apellido[20];
    char nombre[20];
} estudiante;

void guardar(estudiante * menores_30, int * ce, void *dato);
void mostrar(estudiante* est);
void procesarEstudiantes(estudiante *p, int ce, estudiante * menores_30,void guardar(estudiante *, int * ce, void *),int*cant_30);
int main()
{
    estudiante est[]=
    {
        {33528123,"Perez","Lautaro"},
        {25832123,"Fernandez","Alejo"},
        {23145556,"Gomez","Monica"},
        {20900345,"Diaz","Victoria"},
        {28032431,"Gonzales","Agustina"},
        {90201889,"Gomez","Pablo"},
        {42046646,"Fernandez","Luciano"},
        {24047223,"Martin","Lorena"}
    };

    estudiante menores_30[10];
    estudiante *psub_30 = menores_30;
    int ce = sizeof(est) / sizeof(estudiante);
    int cant_30;
    procesarEstudiantes(est,ce,menores_30,guardar,&cant_30);
    for(int i = 0;i<cant_30;i++)
       {
        mostrar(psub_30);
        psub_30++;
       }


return 0;
}




void mostrar(estudiante* est)
{

    printf("\nDNI:%d",est->dni);
    printf("\nAPELLIDO:%s",est->apellido);
    printf("\nNOMBRE:%s",est->nombre);
    printf("\n-----------\n");

}

void guardar(estudiante * menores_30, int * ce, void *dato)
{
    memcpy(menores_30+ *(ce), dato,sizeof(estudiante));
    (*ce)++;

}

void procesarEstudiantes(estudiante *p, int ce, estudiante * menores_30,void guardar(estudiante *, int * , void *),int*cant_30)
{
    estudiante *ult = p +ce;
    while(p!=ult)
    {
        if(p->dni<30000000)
            guardar(menores_30,cant_30,p);
        p++;
    }
}

Modificación:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
    int dni;
    char apellido[20];
    char nombre[20];
} estudiante;


void mostrar(estudiante* est);
typedef void (*Guardar)(estudiante * menores_30, int * ce, void *dato);

void guardar_datos(estudiante * menores_30, int * ce, void *dato)
{
    memcpy(menores_30+ *(ce), dato,sizeof(estudiante));
    (*ce)++;

}

void procesarEstudiantes(estudiante *p, int ce, estudiante * menores_30,Guardar guardar_datos,int*cant_30)
{
    estudiante *ult = p +ce;
    while(p!=ult)
    {
        if(p->dni<30000000)
            guardar_datos(menores_30,cant_30,p);
        p++;
    }
}



int main()
{
    estudiante est[]=
    {
        {33528123,"Perez","Lautaro"},
        {25832123,"Fernandez","Alejo"},
        {23145556,"Gomez","Monica"},
        {20900345,"Diaz","Victoria"},
        {28032431,"Gonzales","Agustina"},
        {90201889,"Gomez","Pablo"},
        {42046646,"Fernandez","Luciano"},
        {24047223,"Martin","Lorena"}
    };

    estudiante menores_30[10];
    estudiante *psub_30 = menores_30;
    int ce = sizeof(est) / sizeof(estudiante);
    int cant_30;
    procesarEstudiantes(est,ce,menores_30,guardar_datos,&cant_30);
    for(int i = 0;i<cant_30;i++)
       {
        mostrar(psub_30);
        psub_30++;
       }


return 0;
}




void mostrar(estudiante* est)
{

    printf("\nDNI:%d",est->dni);
    printf("\nAPELLIDO:%s",est->apellido);
    printf("\nNOMBRE:%s",est->nombre);
    printf("\n-----------\n");

}