Dominando structs y punteros en C: Guía práctica
Dominando structs y punteros en C: Guía práctica
Descubra cómo aprovechar punteros para navegar miembros de structs, y aprenda asignación dinámica de memoria para estructuras de datos flexibles en C.
Antes de sumergirse en punteros con structs, familiarícese con estos temas fundamentales:
Uso de punteros para referenciar structs
A continuación se muestra un ejemplo conciso que muestra cómo declarar un struct y un puntero que lo referencia.
struct Person {
int member1;
int member2;
/* miembros adicionales */
};
int main(void) {
struct Person *ptr, harry;
/* ptr ahora puede apuntar a cualquier instancia Person */
}
En este fragmento, ptr es un puntero a una instancia de struct Person.
Ejemplo: Acceso a miembros de struct a través de un puntero
Para leer o escribir campos de struct mediante un puntero, use el operador ->.
#include <stdio.h>
struct Person {
int age;
float weight;
};
int main(void) {
struct Person *personPtr, person1;
personPtr = &person1; /* apuntar a person1 */
printf("Introduzca edad: ");
scanf("%d", &personPtr->age);
printf("Introduzca peso: ");
scanf("%f", &personPtr->weight);
printf("\nMostrando:\n");
printf("Edad: %d\n", personPtr->age);
printf("Peso: %f", personPtr->weight);
return 0;
}
Aquí, personPtr = &person1; almacena la dirección de person1 en personPtr. El acceso subsiguiente vía personPtr->campo es equivalente a (*personPtr).campo, ofreciendo sintaxis concisa.
personPtr->agees lo mismo que(*personPtr).agepersonPtr->weightes lo mismo que(*personPtr).weight
Asignación dinámica de memoria para structs
Cuando el número de instancias de struct requerido no se conoce en tiempo de compilación, asigne memoria en tiempo de ejecución usando la biblioteca estándar de C.
Ejemplo: Asignar un array de structs
#include <stdio.h>
#include <stdlib.h>
struct Person {
int age;
float weight;
char name[30];
};
int main(void) {
struct Person *ptr;
int i, n;
printf("Introduzca el número de personas: ");
scanf("%d", &n);
ptr = (struct Person*)malloc(n * sizeof(struct Person));
if (!ptr) {
fprintf(stderr, "Falló la asignación de memoria\n");
return EXIT_FAILURE;
}
for (i = 0; i < n; ++i) {
printf("Introduzca nombre y edad respectivamente: ");
scanf("%s %d", (ptr + i)->name, &(ptr + i)->age);
}
printf("\nMostrando información:\n");
for (i = 0; i < n; ++i) {
printf("Nombre: %s\tEdad: %d\n", (ptr + i)->name, (ptr + i)->age);
}
free(ptr);
return 0;
}
Ejecutar el programa produce:
Introduzca el número de personas: 2 Introduzca nombre y edad respectivamente: Harry 24 Introduzca nombre y edad respectivamente: Gary 32 Mostrando información: Nombre: Harry Edad: 24 Nombre: Gary Edad: 32
Este ejemplo demuestra cómo crear n instancias de struct Person en el heap, leer entrada del usuario en cada una y luego mostrar los resultados.
Lenguaje C
- Entendiendo palabras clave e identificadores en C#: Reglas, listas y mejores prácticas
- Clases y objetos en C#: Fundamentos para POO robusta
- Dominando clases y métodos abstractos en C#: Guía práctica
- Entendiendo clases y métodos parciales en C#
- Dominando clases y métodos sealed en C#: Cuándo usarlos, ejemplos claros y mejora de seguridad y rendimiento
- Entendiendo los Structs en C#: Definición, Uso y Diferencias Clave
- Palabras clave e identificadores en C: guía práctica
- Dominando punteros en C: Tutorial práctico guiado por expertos
- Entendiendo la relación entre arrays y punteros en C
- Programación en C: Pasar direcciones y punteros a funciones – Guía práctica
- Dominando structs en C: Definición, variables, acceso y ejemplos avanzados