Punteros a estructuras
Parte de la sección Lógica y Flujo del Journey de C de Coddy. Lección 44 de 63.
Ahora que ya te sientes cómodo trabajando con estructuras, es hora de combinarlas con otro concepto potente 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 de tipo estructura.
La sintaxis para declarar un puntero a una estructura sigue el mismo patrón que las demás 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, usa el operador de dirección:
ptr = &p1;Para leer un miembro a través del puntero, desreferéncialo y después usa el operador punto. Los paréntesis son necesarios, porque . tiene mayor precedencia que *:
printf("%d", (*ptr).x); // igual que p1.xAhora ptr contiene la dirección de memoria de la variable de estructura p1. Esto abre nuevas posibilidades para trabajar con estructuras, especialmente al pasarlas a funciones o gestionar la memoria dinámicamente. Los punteros a estructuras son esenciales para crear estructuras de datos más complejas y escribir programas eficientes en C.
Desafío
FácilCrea un programa en C que demuestre cómo trabajar con punteros a estructuras. Tu programa debe:
- Definir una
structllamadaProductcon los siguientes miembros:- Un entero
idpara almacenar el ID del producto - Un arreglo de caracteres
namede tamaño 25 para almacenar el nombre del producto - Un número de punto flotante
pricepara almacenar el precio del producto - Un entero
quantitypara almacenar la cantidad disponible
- Un entero
- En la función principal, crear una variable
Productllamadaiteme inicializarla con los siguientes valores:- ID: 501
- Nombre: "Laptop"
- Precio: 899.99
- Cantidad: 15
- Declarar un puntero a una estructura
ProductllamadoitemPtr - Asignar la dirección de la variable
itemaitemPtrusando el operador de dirección - Imprimir la información original del producto accediendo directamente a los miembros de la estructura (usando el operador punto) con este formato exacto:
Original Product Info:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Imprimir la misma información del producto accediendo a los miembros de la estructura a través del puntero (usando el operador de desreferenciación y la notación de punto:
(*itemPtr).member) con este formato exacto:Product Info via Pointer:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Verificar que el puntero apunte correctamente a la estructura imprimiendo las direcciones de memoria con este formato exacto:
Address of item: [address]Value of itemPtr: [address]Address verification: [result]
Para la verificación de las direcciones, 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 usando el operador de dirección y el acceso a los miembros de estructuras a través de punteros usando el operador de desreferenciación combinado con la notación de punto. También verificarás que el puntero contenga correctamente la dirección de la variable de estructura.
Pruébalo tú mismo
#include <stdio.h>
#include <string.h>
// TODO: Define la estructura 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 mediante el 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 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