Menu
Coddy logo textTech

Pasar estructuras por valor

Parte de la sección Logic & Flow del Journey de C de Coddy — lección 46 de 63.

Ahora que sabes cómo trabajar con structs y punteros a structs, es hora de aprender cómo pasar structs completos a funciones. Cuando pasas un struct a una función como parámetro, C utiliza paso por valor, lo que significa que la función recibe una copia completa del struct.

Aquí está la sintaxis para una función que acepta un parámetro de estructura:

void functionName(struct StructureName parameterName) {
    // Cuerpo de la función
}

Usando nuestra conocida estructura Point como ejemplo:

void printPoint(struct Point p) {
    printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}

El concepto clave a entender es que cualquier cambio que realices en el struct dentro de la función no afectará al struct original en la función que realiza la llamada. Esto se debe a que la función trabaja con su propia copia de los datos.

Este enfoque es útil cuando deseas leer o mostrar datos de una struct sin arriesgarte a realizar modificaciones accidentales al original. Sin embargo, ten en cuenta que copiar structs grandes puede ser ineficiente en términos de memoria y rendimiento.

challenge icon

Desafío

Fácil

Crea un programa en C que demuestre el paso de estructuras a funciones por valor. Tu programa debe:

  1. Definir un struct llamado Rectangle con los siguientes miembros:
    • Un entero width para almacenar el ancho del rectángulo
    • Un entero height para almacenar la altura del rectángulo
    • Un arreglo de caracteres color con tamaño 15 para almacenar el color del rectángulo
  2. Escribir una función llamada displayRectangle que:
    • Reciba un struct Rectangle como parámetro (paso por valor)
    • Imprima la información del rectángulo exactamente en este formato:
      • Rectangle Details:
      • Width: [width]
      • Height: [height]
      • Color: [color]
      • Area: [area]
    • Calcule e imprima el área (ancho × altura)
  3. Escribir una función llamada modifyRectangle que:
    • Reciba un struct Rectangle como parámetro (paso por valor)
    • Duplique tanto el ancho como la altura del rectángulo
    • Cambie el color a "Modified"
    • Imprima Inside modifyRectangle function:
    • Llame a displayRectangle para mostrar el rectángulo modificado
  4. En la función principal:
    • Crear una variable Rectangle llamada rect
    • Leer el ancho, la altura y el color de la entrada y asignarlos a los miembros de la estructura
    • Imprimir Original rectangle:
    • Llamar a displayRectangle para mostrar el rectángulo original
    • Llamar a modifyRectangle con el rectángulo
    • Imprimir After modifyRectangle call:
    • Llamar a displayRectangle nuevamente para mostrar que el rectángulo original no ha cambiado

Este desafío demuestra el concepto clave del paso por valor con estructuras: cuando pasas una estructura a una función, la función recibe una copia completa de la estructura. Cualquier modificación realizada dentro de la función afecta solo a la copia, no a la estructura original en la función que realiza la llamada.

Hoja de referencia

Al pasar estructuras a funciones, C utiliza el paso por valor, lo que significa que la función recibe una copia completa de la estructura.

Sintaxis de la función para aceptar un parámetro de estructura:

void functionName(struct StructureName parameterName) {
    // Cuerpo de la función
}

Ejemplo con una estructura Point:

void printPoint(struct Point p) {
    printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}

Concepto clave: Los cambios realizados en la estructura dentro de la función no afectan a la estructura original en la función que la llama, ya que la función trabaja con su propia copia de los datos.

Este enfoque es útil para leer o mostrar datos de estructuras sin riesgo de modificar el original, pero copiar estructuras grandes puede ser ineficiente.

Pruébalo tú mismo

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

// TODO: Define la estructura Rectangle aquí

// TODO: Escribe la función displayRectangle aquí

// TODO: Escribe la función modifyRectangle aquí

int main() {
    // Leer entrada
    int width, height;
    char color[15];
    
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%s", color);
    
    // TODO: Crear la variable Rectangle y asignar los valores de entrada
    
    // TODO: Imprimir "Original rectangle:" y llamar a displayRectangle
    
    // TODO: Llamar a modifyRectangle
    
    // TODO: Imprimir "After modifyRectangle call:" y llamar a displayRectangle de nuevo
    
    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 Logic & Flow