Punteros a estructuras
Parte de la sección Logic & Flow del Journey de C de Coddy — lección 44 de 63.
Ahora que te sientes cómodo trabajando con structs, es hora de combinarlos con otro concepto poderoso de C: los punteros. Al igual que puedes crear punteros a tipos de datos básicos como int o char, también puedes crear punteros que contengan la dirección de una variable struct.
La sintaxis para declarar un puntero a una estructura sigue el mismo patrón que otras declaraciones de punteros:
struct StructureName *pointerName;Por ejemplo, usando nuestra conocida estructura Point:
struct Point p1 = {10, 20};
struct Point *ptr;Esto crea un puntero llamado ptr que puede almacenar la dirección de una estructura Point. Para hacer que el puntero apunte realmente a nuestra variable de estructura, se utiliza el operador de dirección (address-of):
ptr = &p1;Ahora ptr contiene la dirección de memoria de la variable struct p1. Esto abre nuevas posibilidades para trabajar con structs, especialmente al pasarlos a funciones o gestionar la memoria de forma dinámica. Los punteros a structs son esenciales para construir estructuras de datos más complejas y escribir programas en C eficientes.
Desafío
FácilCrea un programa en C que demuestre el trabajo con punteros a estructuras. Tu programa debe:
- Definir un
structllamadoProductcon los siguientes miembros:- Un entero
idpara almacenar el ID del producto - Un arreglo de caracteres
namecon tamaño 25 para almacenar el nombre del producto - Un flotante
pricepara almacenar el precio del producto - Un entero
quantitypara almacenar la cantidad disponible
- Un entero
- En la función main, crea una variable de tipo
Productllamadaiteme inicialízala con los siguientes valores:- ID: 501
- Name: "Laptop"
- Price: 899.99
- Quantity: 15
- Declara un puntero a una estructura
ProductllamadoitemPtr - Asigna la dirección de la variable
itemaitemPtrutilizando el operador de dirección (address-of) - Imprime la información original del producto accediendo a los miembros de la estructura directamente (usando el operador punto) en este formato exacto:
Original Product Info:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Imprime la misma información del producto accediendo a los miembros de la estructura a través del puntero (usando el operador de desreferencia y la notación de punto:
(*itemPtr).member) en este formato exacto:Product Info via Pointer:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Verifica que el puntero esté apuntando correctamente a la estructura imprimiendo las direcciones de memoria en este formato exacto:
Address of item: [address]Value of itemPtr: [address]Address verification: [result]
Para la verificación de la dirección, imprime Match si las direcciones son iguales, o No Match si son diferentes.
Este desafío pone a prueba tu comprensión de la declaración de punteros a estructuras, la asignación de direcciones mediante el operador de dirección y el acceso a los miembros de la estructura a través de punteros utilizando el operador de desreferencia combinado con la notación de punto. También verificarás que el puntero contiene correctamente la dirección de la variable de la estructura.
Hoja de referencia
Puedes crear punteros a estructuras utilizando la misma sintaxis que otras declaraciones de punteros:
struct StructureName *pointerName;Para hacer que un puntero apunte a una variable de estructura, utiliza el operador de dirección:
struct Point p1 = {10, 20};
struct Point *ptr;
ptr = &p1;Accede a los miembros de la estructura a través de un puntero utilizando el operador de desreferencia y la notación de punto:
(*ptr).memberPruébalo tú mismo
#include <stdio.h>
#include <string.h>
// TODO: Define el struct Product aquí
int main() {
// TODO: Escribe tu código aquí
// 1. Crea e inicializa la variable Product 'item'
// 2. Declara un puntero a Product llamado 'itemPtr'
// 3. Asigna la dirección de 'item' a 'itemPtr'
// 4. Imprime la información original del producto usando el operador punto
// 5. Imprime la información del producto a través del puntero usando (*itemPtr).member
// 6. Imprime y verifica las direcciones
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