Menu
Coddy logo textTech

Puntero vs. Valor

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

Cuando pasas una estructura a una función, C te ofrece dos opciones: pasarla por valor (copiar la estructura completa) o pasarla por puntero (copiar solo la dirección). La elección importa significativamente para el rendimiento.

Pasar por valor crea una copia completa de la estructura en la pila. Para una estructura pequeña con unos pocos enteros, esto está bien. Pero imagina una estructura con cientos de bytes: cada llamada a una función copia todos esos datos:

typedef struct {
    char name[100];
    int scores[50];
    double average;
} Student;

// Por valor: copia ~308 bytes en cada llamada
void print_by_value(Student s) {
    printf("%s: %.2f\n", s.name, s.average);
}

// Por puntero: copia solo 8 bytes (la dirección)
void print_by_pointer(const Student *s) {
    printf("%s: %.2f\n", s->name, s->average);
}

La sintaxis también difiere. Con un parámetro de valor, usas el operador punto (s.name). Con un puntero, usas el operador flecha (s->name).

La versión con puntero es más eficiente porque solo pasa una dirección de memoria, normalmente de 8 bytes independientemente del tamaño de la estructura.

Por eso los programadores de C casi siempre pasan las estructuras mediante un puntero. Usa const cuando la función no deba modificar los datos, y un puntero normal cuando deba hacerlo. Obtienes tanto eficiencia como una intención clara.

challenge icon

Desafío

Fácil

Vamos a crear un módulo Product que demuestre la diferencia entre pasar estructuras por valor y por puntero. Crearás dos funciones de visualización: una que recibe la estructura completa como una copia y otra que recibe solo un puntero a ella.

Crearás tres archivos:

  • product.h: Declara una estructura Product con tres miembros: char name[50], double price y int quantity. Declara también dos funciones:
    • display_by_value: recibe un Product por valor e imprime su información
    • display_by_pointer: recibe un const Product * e imprime la misma información
    Usa protecciones de inclusión con el símbolo PRODUCT_H.
  • product.c: Implementa ambas funciones. Observa la diferencia de sintaxis: la versión por valor usa el operador punto (p.name), mientras que la versión con puntero usa el operador flecha (p->name). Ambas funciones deben imprimir con el mismo formato.
  • main.c: Crea un Product y, después, llama a ambas funciones de visualización para mostrar que producen una salida idéntica a pesar de usar estilos de parámetros diferentes.

Recibirás tres entradas: el nombre del producto (una cadena), el precio (un double) y la cantidad (un entero).

En tu archivo principal, inicializa un Product con estos valores y, después, llama a display_by_value seguido de display_by_pointer.

Ambas funciones deben imprimir con este formato:

Product: {name}, Price: {price}, Qty: {quantity}

Usa %.2f para el precio, de modo que se muestren dos decimales.

Por ejemplo, con las entradas Laptop, 999.99 y 5, la salida sería:

Product: Laptop, Price: 999.99, Qty: 5
Product: Laptop, Price: 999.99, Qty: 5

Pruébalo tú mismo

#include <stdio.h>
#include <string.h>
#include "product.h"

int main() {
    char name[50];
    double price;
    int quantity;
    
    // Leer entradas
    scanf("%s", name);
    scanf("%lf", &price);
    scanf("%d", &quantity);
    
    // TODO: Crea una variable Product e inicialízala con los valores de entrada
    // Pista: Usa strcpy para copiar el name en el campo name de la struct
    
    // TODO: Llama a display_by_value con el Product
    
    // TODO: Llama a display_by_pointer con un puntero al Product
    
    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