L’operatore freccia (->)
Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 45 di 63.
Quando lavori con puntatori a struct, per accedere ai membri della struct è necessaria una sintassi speciale. Anche se potresti usare insieme l’operatore di dereferenziazione e la notazione con il punto, C fornisce un operatore più pratico, specifico per questo scopo: l’operatore freccia (->).
L’operatore freccia consente di accedere ai membri di una struct tramite un puntatore in modo chiaro e leggibile:
ptr->memberÈ equivalente a scrivere (*ptr).member, ma è molto più conciso.
Ecco come funziona nella pratica:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// Uso del operador 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);L’operatore freccia rende il tuo codice più pulito e facile da leggere, soprattutto quando lavori con strutture dati complesse. È il modo standard per accedere ai membri di una struct tramite puntatori nella programmazione in C.
Sfida
FacileCrea un programma C che mostri come usare l’operatore freccia per accedere ai membri di una struct tramite puntatori. Il programma deve:
- Definire una
structdenominataBookcon i seguenti membri:- Un intero
idper memorizzare l’ID del libro - Un array di caratteri
titledi dimensione 40 per memorizzare il titolo del libro - Un array di caratteri
authordi dimensione 30 per memorizzare il nome dell’autore - Un valore float
priceper memorizzare il prezzo del libro - Un intero
pagesper memorizzare il numero di pagine
- Un intero
- Nella funzione principale, creare una variabile
BookdenominatamyBook - Dichiarare un puntatore a una struct
BookdenominatobookPtr - Assegnare l’indirizzo di
myBookabookPtr - Leggere i seguenti valori di input e assegnarli ai membri della struct usando l’operatore freccia tramite il puntatore:
- Leggere un intero per l’ID e assegnarlo usando
bookPtr->id - Leggere una stringa per il titolo e assegnarla usando
bookPtr->title - Leggere una stringa per l’autore e assegnarla usando
bookPtr->author - Leggere un valore float per il prezzo e assegnarlo usando
bookPtr->price - Leggere un intero per le pagine e assegnarlo usando
bookPtr->pages
- Leggere un intero per l’ID e assegnarlo usando
- Dopo aver letto tutti i valori, eseguire le seguenti operazioni usando l’operatore freccia:
- Applicare uno sconto del 10% al prezzo:
bookPtr->price = bookPtr->price * 0.9; - Aggiungere 50 pagine bonus:
bookPtr->pages += 50;
- Applicare uno sconto del 10% al prezzo:
- Stampare le informazioni del libro usando l’operatore freccia per accedere a ciascun membro, esattamente nel seguente formato:
Book Information:ID: [id]Title: [title]Author: [author]Price: [price]Pages: [pages]
- Calcolare e stampare il prezzo per pagina usando l’operatore freccia nel formato:
Price per page: [price_per_page]
Questa sfida verifica la tua comprensione dell’operatore freccia per accedere ai membri di una struct tramite puntatori. Farai pratica con la sintassi ptr->member per leggere e scrivere i membri di una struct, dimostrando che è equivalente a (*ptr).member, ma molto più pratica e leggibile.
Provalo tu
#include <stdio.h>
#include <string.h>
// TODO: Definisci qui la struct Book
int main() {
// TODO: Crea una variabile di tipo Book chiamata myBook
// TODO: Dichiara un puntatore a Book chiamato bookPtr
// TODO: Assegna l'indirizzo di myBook a bookPtr
// Leggi i valori di input
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: Assegna i valori di input ai membri della struct usando l'operatore freccia
// TODO: Applica uno sconto del 10% a price usando l'operatore freccia
// TODO: Aggiungi 50 pagine bonus usando l'operatore freccia
// TODO: Stampa le informazioni sul libro usando l'operatore freccia
// TODO: Calcola e stampa il prezzo per pagina usando l'operatore freccia
return 0;
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Fondamenti dei puntatori
Che cos’è un puntatore?Dichiarare i puntatoriL’operatore di indirizzo (&)L’operatore di dereferenziazione (*)Puntatori NULLRiepilogo: nozioni di base sui puntatori4Progetto: Utility di testo semplice
Panoramica del progettoConteggio dei caratteri2Puntatori e array
I nomi degli array come puntatoriElementi degli array e puntatoriAritmetica dei puntatoriConfrontare i puntatoriRiepilogo: attraversamento di un array con i puntatori5Puntatori e funzioni
Passaggio per valorePassare puntatori alle funzioniModificare le variabili tramite puntatoriUn esempio classico: scambiare valoriPassare array alle funzioniRiepilogo: argomenti puntatore nelle funzioni8Struct e puntatori
Puntatori a structL’operatore freccia (->)Passare le struct per valorePassare puntatori a structAllocazione dinamica delle structRiepilogo: modifica di una struct - puntatore3Array di caratteri e stringhe
Stringhe come array di charIl terminatore nullInput di stringhe con scanfUso di strlen()Uso di strcpy()Uso di strcat()Uso di strcmp()Riepilogo: funzioni di base per le stringhe6Gestione della memoria
Memoria Stack vs. HeapAllocazione dinamica - malloc()Usare sizeof() per l'allocazioneVerificare il fallimento dell'allocazioneLiberare la memoria con free()Allocare con calloc()Riepilogo: array dinamico9Progetto: Inserimento semplice di un contatto
Progetto: Definire una struct ContattoFunzione per creare un contattoEsercitati da solo: Compilatore C online