Punteros a funciones en C: ejercicio resuelto con callbacks
Punteros a funciones en C: ejercicio resuelto paso a paso
Si buscas un ejercicio de punteros a funciones en C resuelto, aquí tienes los tres usos más comunes: llamada directa, tabla de funciones y callback en qsort.
Un puntero a función almacena la dirección de una función con una firma concreta. Permite elegir en tiempo de ejecución qué función invocar sin necesidad de switch o if-else.
Firma de un puntero a función
Por ejemplo, un puntero a función que recibe dos int y devuelve un int:
Enunciado
- Define cuatro operaciones aritméticas básicas como funciones independientes.
- Llama a una de ellas a través de un puntero a función.
- Crea una tabla (array) de punteros a función para recorrer todas las operaciones.
- Usa un puntero a función como callback en
qsortpara ordenar un array de enteros de mayor a menor.
Solución en C
Resultado esperado
Errores frecuentes
- Olvidar los paréntesis en la declaración:
int *f(int)declara una función que devuelveint*, no un puntero a función. - No coincidir la firma del puntero con la firma de la función asignada.
- Llamar al puntero sin desreferenciarlo: tanto
(*op)(x, y)comoop(x, y)son válidos en C moderno, pero la segunda forma es más habitual. - En
qsort, hacer la resta directamente (return a - b) puede desbordarse con enteros grandes; la forma segura es devolver(a > b) - (a < b).
Aplicación práctica
Los punteros a función aparecen en:
- callbacks de ordenación (
qsort,bsearch), - sistemas de plugins o estrategias intercambiables,
- máquinas de estados donde cada estado tiene su propia función de procesamiento,
- APIs de C que aceptan funciones de usuario (señales, threads).
Siguiente ejercicio recomendado
- calloc en C: ejercicio resuelto
- Puntero a puntero en C: ejercicio resuelto
- Quicksort en C: ejercicio resuelto
- Todos los ejercicios de C
Práctica guiada y siguiente paso
Si quieres una ruta completa con progresión real de dificultad:
FAQ
¿Cuál es la diferencia entre (*op)(x, y) y op(x, y)?
Ambas formas son equivalentes en C. La primera desreferencia explícitamente el puntero; la segunda usa la notación abreviada que el compilador acepta desde C89. La segunda es más común en código moderno.
¿Puedo pasar un puntero a función como argumento?
Sí. Es el mecanismo de callback: void aplicar(int a, int b, int (*f)(int,int)) { printf("%d\n", f(a, b)); }.
¿Los punteros a función son seguros?
Son seguros siempre que apunten a una función válida. El riesgo es asignarles NULL y llamarlos sin comprobar, o asignar una función con firma incompatible (comportamiento indefinido).