Menu
Coddy logo textTech

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.

challenge icon

Desafío

Fácil

Crea un programa en C que demuestre el trabajo con punteros a estructuras. Tu programa debe:

  1. Definir un struct llamado Product con los siguientes miembros:
    • Un entero id para almacenar el ID del producto
    • Un arreglo de caracteres name con tamaño 25 para almacenar el nombre del producto
    • Un flotante price para almacenar el precio del producto
    • Un entero quantity para almacenar la cantidad disponible
  2. En la función main, crea una variable de tipo Product llamada item e inicialízala con los siguientes valores:
    • ID: 501
    • Name: "Laptop"
    • Price: 899.99
    • Quantity: 15
  3. Declara un puntero a una estructura Product llamado itemPtr
  4. Asigna la dirección de la variable item a itemPtr utilizando el operador de dirección (address-of)
  5. 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]
  6. 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]
  7. 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).member

Prué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;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Logic & Flow