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