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.
Desafío
FácilCrea un programa en C que demuestre el paso de estructuras a funciones por valor. Tu programa debe:
- Definir un
structllamadoRectanglecon los siguientes miembros:- Un entero
widthpara almacenar el ancho del rectángulo - Un entero
heightpara almacenar la altura del rectángulo - Un arreglo de caracteres
colorcon tamaño 15 para almacenar el color del rectángulo
- Un entero
- Escribir una función llamada
displayRectangleque:- Reciba un
structRectanglecomo 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)
- Reciba un
- Escribir una función llamada
modifyRectangleque:- Reciba un
structRectanglecomo 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
displayRectanglepara mostrar el rectángulo modificado
- Reciba un
- En la función principal:
- Crear una variable
Rectanglellamadarect - Leer el ancho, la altura y el color de la entrada y asignarlos a los miembros de la estructura
- Imprimir
Original rectangle: - Llamar a
displayRectanglepara mostrar el rectángulo original - Llamar a
modifyRectanglecon el rectángulo - Imprimir
After modifyRectangle call: - Llamar a
displayRectanglenuevamente para mostrar que el rectángulo original no ha cambiado
- Crear una variable
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;
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Fundamentos de Punteros
¿Qué es un puntero?Declaración de punterosEl operador de dirección (&)El operador de desreferencia (*)Punteros NULLResumen: Conceptos básicos de punteros4Proyecto: Utilidad de texto simple
Descripción general del proyectoContar caracteres2Punteros y Arrays
Nombres de Arrays como PunterosElementos de un Array - PunterosAritmética de PunterosComparación de PunterosResumen: Recorrido de Arrays con Punteros5Punteros y funciones
Paso por valorPasar punteros a funcionesModificar variables mediante punterosUn ejemplo clásico: Intercambio (Swap)Pasar arrays a funcionesResumen: Argumentos de punteros a funciones8Estructuras y Punteros
Punteros a estructurasEl operador flecha (->)Pasar estructuras por valorPasar punteros a estructurasAsignación dinámica de estructurasResumen: Modificar estructuras - Ptr3Arreglos de caracteres y cadenas
Cadenas como arreglos de charEl terminador nuloEntrada de cadenas con scanfUso de strlen()Uso de strcpy()Uso de strcat()Uso de strcmp()Resumen: Funciones básicas de cadenas