Llamada a punteros a funciones
Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 34 de 61.
Ahora que sabes cómo declarar un puntero a función y asignarle una función, el siguiente paso es llamar realmente a la función mediante ese puntero.
La sintaxis es sencilla. Usas el puntero a función igual que llamarías a una función normal:
int add(int a, int b) {
return a + b;
}
int main() {
int (*operation)(int, int) = add;
int result = operation(5, 3); // Llama a add(5, 3)
printf("%d\n", result); // Salida: 8
return 0;
}Simplemente escribe el nombre del puntero seguido de paréntesis que contengan los argumentos. C desreferencia automáticamente el puntero y ejecuta la función a la que apunta.
También puedes usar la sintaxis de desreferenciación explícita con (*operation)(5, 3), pero es opcional y menos común. Ambas formas producen resultados idénticos.
El verdadero poder surge cuando reasignas el puntero a diferentes funciones:
int subtract(int a, int b) {
return a - b;
}
operation = subtract;
result = operation(5, 3); // Ahora llama a subtract(5, 3)
printf("%d\n", result); // Salida: 2La misma variable operation ahora ejecuta una lógica completamente diferente. Esta capacidad de intercambiar el comportamiento en tiempo de ejecución es la base del polimorfismo en C.
Desafío
FácilPractiquemos cómo llamar a funciones mediante punteros y cómo cambiar qué función se ejecuta. Crearás una calculadora sencilla que puede alternar entre suma y resta durante la ejecución.
Escribe un programa que:
- Defina dos funciones:
add: recibe dos parámetrosinty devuelve su sumasubtract: recibe dos parámetrosinty devuelve el primero menos el segundo
- En
main, declare un puntero a función llamadocalcque pueda apuntar a funciones que reciban dos parámetrosinty devuelvan unint - Lea cuatro entradas: dos enteros y dos códigos de operación
- Para cada código de operación:
- Asigne la función correspondiente a
calc(1 para sumar, 2 para restar) - Llame a la función mediante el puntero usando los dos números
- Imprima el resultado
- Asigne la función correspondiente a
Recibirás cuatro entradas: el primer número, el segundo número, el primer código de operación (1 o 2) y el segundo código de operación (1 o 2).
Tu salida debe mostrar dos resultados en líneas separadas: uno por cada operación realizada usando los mismos dos números:
15
5En este ejemplo, con las entradas 10, 5, 1, 2: la primera operación (código 1) suma 10 + 5 = 15, después se reasigna el puntero y la segunda operación (código 2) resta 10 - 5 = 5.
Esto demuestra cómo la misma variable de puntero puede ejecutar una lógica completamente diferente al reasignarla entre llamadas.
Pruébalo tú mismo
#include <stdio.h>
// TODO: Define la función add aquí
// TODO: Define la función subtract aquí
int main() {
// Leer entradas
int num1, num2, op1, op2;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &op1);
scanf("%d", &op2);
// TODO: Declara un puntero a función llamado 'calc' que pueda apuntar a
// funciones que toman dos parámetros int y devuelven un int
// TODO: Para el primer código de operación (op1):
// - Asigna la función apropiada a calc (1 para add, 2 para subtract)
// - Llama a la función a través del puntero e imprime el resultado
// TODO: Para el segundo código de operación (op2):
// - Reasigna calc a la función apropiada
// - Llama a la función a través del puntero e imprime el resultado
return 0;
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculoImplementación del rectánguloUso polimórficoContenedor de figurasPractica por tu cuenta: Compilador de C online