Pasar estructuras por valor
Parte de la sección Lógica y Flujo del Journey de C de Coddy. Lección 46 de 63.
Ahora que sabes cómo trabajar con estructuras y punteros a estructuras, es hora de aprender a pasar estructuras completas a las funciones. Cuando pasas una estructura a una función como parámetro, C utiliza la paso por valor, lo que significa que la función recibe una copia completa de la estructura.
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 que debes comprender es que cualquier cambio que hagas en la estructura dentro de la función no afectará a la estructura original de 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 quieres leer o mostrar datos de una estructura sin arriesgarte a modificar accidentalmente el original. Sin embargo, ten en cuenta que copiar estructuras grandes puede ser ineficiente en términos de memoria y rendimiento.
Desafío
FácilCrea un programa en C que demuestre cómo pasar estructuras a funciones por valor. Tu programa debe:
- Definir una
structllamadaRectanglecon 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
colorde tamaño 15 para almacenar el color del rectángulo
- Un entero
- Escribir una función llamada
displayRectangleque:- Reciba una estructura
Rectanglecomo parámetro (paso por valor) - Imprima la información del rectángulo en este formato exacto:
Rectangle Details:Width: [width]Height: [height]Color: [color]Area: [area]
- Calcule e imprima el área (ancho × altura)
- Reciba una estructura
- Escribir una función llamada
modifyRectangleque:- Reciba una estructura
Rectanglecomo 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 una estructura
- En la función principal:
- Cree una variable
Rectanglellamadarect - Lea el ancho, la altura y el color de la entrada, y asígnelos a los miembros de la estructura
- Imprima
Original rectangle: - Llame a
displayRectanglepara mostrar el rectángulo original - Llame a
modifyRectanglecon el rectángulo - Imprima
After modifyRectangle call: - Llame nuevamente a
displayRectanglepara mostrar que el rectángulo original no ha cambiado
- Cree 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 únicamente a la copia, no a la estructura original de la función que realiza la llamada.
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 Lógica y Flujo
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 cadenasPractica por tu cuenta: Compilador de C online