Crear estructuras de datos propias es uno de los pasos fundamentales para organizar información de manera eficiente en C++. Aquí se explica cómo definir un struct, instanciarlo de forma estática y dinámica, y acceder a sus atributos con las dos notaciones que el lenguaje ofrece.
¿Cómo se define un struct en C++?
La palabra reservada struct permite agrupar distintos tipos de datos bajo un mismo nombre. En el ejemplo se crea una estructura llamada persona con dos atributos: un string para el nombre y un int para la edad [00:25].
cpp
#include <string>
using namespace std;
struct persona {
string nombre;
int edad;
};
Es importante recordar que la definición del struct debe terminar con punto y coma después de la llave de cierre; de lo contrario, el compilador marcará un error [01:15]. Una vez definida, la estructura se comporta como cualquier otro tipo de dato: se puede usar para declarar variables, pasarlas a funciones o almacenarlas en arreglos.
¿Cuál es la diferencia entre instanciar con variable y con puntero?
Existen dos formas de crear una instancia de persona, y la elección depende de cómo se quiera gestionar la memoria.
Instancia estática (sin puntero)
Se declara igual que cualquier variable. El compilador reserva la memoria durante el tiempo de compilación [01:30].
cpp
persona p = persona();
p.nombre = "Diana";
p.edad = 26;
Para acceder a los atributos se utiliza la notación de punto (p.nombre, p.edad). Se puede leer el valor, imprimirlo con cout o asignarle uno nuevo.
Instancia dinámica (con puntero y new)
Si se necesita memoria dinámica, se crea un puntero a persona y se utiliza la palabra reservada new [02:10]. La memoria se reserva durante la ejecución, no en la compilación.
cpp
persona *p = new persona();
p->nombre = "Diana";
p->edad = 26;
Aquí el cambio clave es la notación de flecha (->) en lugar del punto. Intentar usar el punto con un puntero genera un error de compilación [03:05].
¿Cómo se representa la estructura en memoria?
Cuando se crea una instancia de persona, el lenguaje aparta un segmento de memoria cuyo tamaño depende de la suma de bytes de cada atributo [04:00]:
- nombre (
string): almacena los caracteres necesarios más el carácter nulo de cierre.
- edad (
int): ocupa los bytes estándar de un entero en la arquitectura del sistema.
Este bloque contiguo es lo que permite acceder rápidamente a cada campo, ya sea mediante la variable directa o a través del puntero que apunta a la dirección base de ese segmento.
¿Cómo verificar los valores almacenados?
Imprimir con cout es la forma más directa de comprobar que todo funciona [03:25]:
cpp
cout << p->nombre << endl;
cout << p->edad << endl;
Al ejecutar con F6, el programa muestra primero el nombre y luego la edad, confirmando que la asignación y la lectura operan correctamente tanto con la notación de punto como con la de flecha.
Prueba ambas versiones en tu computadora, experimenta imprimiendo las direcciones de memoria con & y observa cómo se comportan internamente los punteros. Si tienes dudas o resultados inesperados, compártelos en los comentarios.