Llamada a punteros a funciones
Parte de la sección Object Oriented Programming 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 realmente llamar a la función a través de ese puntero.
La sintaxis es sencilla — utilizas el puntero de función tal como llamarías a una función regular:
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 escriba 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 desreferencia 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 a través de punteros y cómo intercambiar qué función se ejecuta. Construirás una calculadora sencilla que puede alternar entre suma y resta en tiempo de ejecución.
Escribe un programa que:
- Defina dos funciones:
add— toma dos parámetrosinty devuelve su sumasubtract— toma dos parámetrosinty devuelve el primero menos el segundo
- En
main, declare un puntero a función llamadocalcque pueda apuntar a funciones que tomen 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 apropiada a
calc(1 para add, 2 para subtract) - Llame a la función a través del puntero con los dos números
- Imprima el resultado
- Asigne la función apropiada 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 utilizando 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, luego el puntero se reasigna, 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.
Hoja de referencia
Para llamar a una función a través de un puntero, use el nombre del puntero seguido de paréntesis con los argumentos:
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;
}También puede usar la sintaxis de desreferencia explícita (*operation)(5, 3), pero es opcional.
Los punteros a funciones pueden reasignarse para apuntar a diferentes funciones en tiempo de ejecución:
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: 2Esto permite que la misma variable de puntero ejecute una lógica 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 tomen dos parámetros int y devuelvan 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 Object Oriented Programming
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írculo