Menu
Coddy logo textTech

Repaso de punteros void

Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 49 de 61.

Un void* es la forma que tiene C de decir «un puntero a algo, pero no voy a decirte a qué». Puede contener la dirección de cualquier tipo de datos: un int, un float, una estructura o cualquier otra cosa. Esto lo convierte en la base para escribir código genérico en C.

El inconveniente es que no puedes desreferenciar un void* directamente. El compilador no sabe cuántos bytes debe leer ni cómo interpretarlos. Para usar los datos, debes convertirlo de nuevo al tipo correcto:

void print_int(void* data) {
    int* p = (int*)data;
    printf("%d\n", *p);
}

int main() {
    int x = 42;
    print_int(&x);
    return 0;
}

Esta flexibilidad implica responsabilidad. Si conviertes al tipo equivocado, el compilador no te detendrá, pero tu programa producirá basura o se bloqueará. Por eso las funciones genéricas suelen combinar un void* con un indicador de tipo (como un enumerado o un indicador) para que la función sepa cómo interpretar los datos correctamente.

En las próximas lecciones, usarás void* para crear contenedores que puedan almacenar cualquier tipo de datos, lo que permitirá disponer de estructuras de datos verdaderamente reutilizables.

challenge icon

Desafío

Fácil

Escribe una función llamada print_value que acepte dos parámetros: un puntero void* a los datos y una bandera de tipo int. La función debe interpretar e imprimir los datos según la bandera de tipo:

  • Si la bandera de tipo es 0, convierte el puntero a int* e imprime el valor entero
  • Si la bandera de tipo es 1, convierte el puntero a float* e imprime el valor de punto flotante con 2 decimales

Tu programa recibirá dos entradas:

  1. Una bandera de tipo (0 para entero, 1 para punto flotante)
  2. Un valor numérico

Según la bandera de tipo, almacena el valor en el tipo de variable apropiado; después, llama a print_value con un puntero a esa variable y la bandera de tipo.

Salida de ejemplo cuando las entradas son 0 y 42:

42

Salida de ejemplo cuando las entradas son 1 y 3.14:

3.14

Salida de ejemplo cuando las entradas son 0 y -17:

-17

Salida de ejemplo cuando las entradas son 1 y 99.5:

99.50

Pruébalo tú mismo

#include <stdio.h>

// TODO: Escribe tu función print_value aquí


int main() {
    int type_flag;
    scanf("%d", &type_flag);
    
    if (type_flag == 0) {
        int int_value;
        scanf("%d", &int_value);
        
        // TODO: Llama a print_value con un puntero a int_value y el type flag
        
    } else if (type_flag == 1) {
        float float_value;
        scanf("%f", &float_value);
        
        // TODO: Llama a print_value con un puntero a float_value y el type flag
        
    }
    
    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 Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C online