Menu
Coddy logo textTech

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: 2

La 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.

challenge icon

Desafío

Fácil

Practiquemos 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:

  1. Defina dos funciones:
    • add — toma dos parámetros int y devuelve su suma
    • subtract — toma dos parámetros int y devuelve el primero menos el segundo
  2. En main, declare un puntero a función llamado calc que pueda apuntar a funciones que tomen dos parámetros int y devuelvan un int
  3. Lea cuatro entradas: dos enteros y dos códigos de operación
  4. 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

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
5

En 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: 2

Esto 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;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming