El operador flecha (->)
Parte de la sección Logic & Flow del Journey de C de Coddy — lección 45 de 63.
Al trabajar con punteros a estructuras, acceder a los miembros de la estructura requiere una sintaxis especial. Si bien podrías usar el operador de desreferencia y la notación de punto juntos, C proporciona un operador más conveniente específicamente para este propósito: el operador flecha (->).
El operador flecha te permite acceder a los miembros de una estructura a través de un puntero de una manera limpia y legible:
ptr->memberEsto es equivalente a escribir (*ptr).member, pero mucho más conciso.
Así es como funciona en la práctica:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// Usando el operador de flecha
printf("x = %d, y = %d\n", ptr->x, ptr->y);
// Esto es lo mismo que:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);El operador de flecha hace que tu código sea más limpio y fácil de leer, especialmente cuando se trabaja con estructuras de datos complejas. Es la forma estándar de acceder a los miembros de struct a través de punteros en la programación en C.
Desafío
FácilCrea un programa en C que demuestre el uso del operador de flecha para acceder a los miembros de una estructura a través de punteros. Tu programa debe:
- Definir un
structllamadoBookcon los siguientes miembros:- Un entero
idpara almacenar el ID del libro - Un arreglo de caracteres
titlecon tamaño 40 para almacenar el título del libro - Un arreglo de caracteres
authorcon tamaño 30 para almacenar el nombre del autor - Un flotante
pricepara almacenar el precio del libro - Un entero
pagespara almacenar el número de páginas
- Un entero
- En la función principal, crea una variable
BookllamadamyBook - Declara un puntero a una estructura
BookllamadobookPtr - Asigna la dirección de
myBookabookPtr - Lee los siguientes valores de entrada y asígnalos a los miembros de la estructura utilizando el operador de flecha a través del puntero:
- Lee un entero para el ID y asígnalo usando
bookPtr->id - Lee una cadena para el título y asígnala usando
bookPtr->title - Lee una cadena para el autor y asígnala usando
bookPtr->author - Lee un flotante para el precio y asígnalo usando
bookPtr->price - Lee un entero para las páginas y asígnalo usando
bookPtr->pages
- Lee un entero para el ID y asígnalo usando
- Después de leer todos los valores, realiza las siguientes operaciones utilizando el operador de flecha:
- Aplica un 10% de descuento al precio:
bookPtr->price = bookPtr->price * 0.9; - Añade 50 páginas de bonificación:
bookPtr->pages += 50;
- Aplica un 10% de descuento al precio:
- Imprime la información del libro utilizando el operador de flecha para acceder a cada miembro en este formato exacto:
Book Information:ID: [id]Title: [title]Author: [author]Price: [price]Pages: [pages]
- Calcula e imprime el precio por página utilizando el operador de flecha en el formato:
Price per page: [price_per_page]
Este desafío pone a prueba tu comprensión del operador de flecha para acceder a los miembros de una estructura a través de punteros. Practicarás el uso de la sintaxis ptr->member tanto para leer como para escribir en los miembros de la estructura, demostrando que es equivalente a (*ptr).member pero mucho más conveniente y legible.
Hoja de referencia
El operador de flecha (->) proporciona una forma conveniente de acceder a los miembros de una estructura a través de un puntero:
ptr->memberEsto es equivalente a (*ptr).member pero más conciso y legible.
Ejemplo de uso:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// Usando el operador de flecha
printf("x = %d, y = %d\n", ptr->x, ptr->y);
// Esto es lo mismo que:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);Pruébalo tú mismo
#include <stdio.h>
#include <string.h>
// TODO: Define la estructura Book aquí
int main() {
// TODO: Crea una variable Book llamada myBook
// TODO: Declara un puntero a Book llamado bookPtr
// TODO: Asigna la dirección de myBook a bookPtr
// Leer valores de entrada
int id;
char title[40];
char author[30];
float price;
int pages;
scanf("%d", &id);
scanf("%s", title);
scanf("%s", author);
scanf("%f", &price);
scanf("%d", &pages);
// TODO: Asigna los valores de entrada a los miembros de la estructura usando el operador flecha
// TODO: Aplica un 10% de descuento al precio usando el operador flecha
// TODO: Añade 50 páginas de bonificación usando el operador flecha
// TODO: Imprime la información del libro usando el operador flecha
// TODO: Calcula e imprime el precio por página usando el operador flecha
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