Menu
CoddyTech

Puntatori a struct

Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 44 di 63.

Ora che hai acquisito familiarità con l’uso delle struct, è il momento di combinarle con un altro potente concetto del C: i puntatori. Proprio come puoi creare puntatori a tipi di dati di base come int o char, puoi anche creare puntatori che contengono l’indirizzo di una variabile struct.

La sintassi per dichiarare un puntatore a una struct segue lo stesso schema delle altre dichiarazioni di puntatori:

struct StructureName *pointerName;

Per esempio, usando la nostra familiare struct Point:

struct Point p1 = {10, 20};
struct Point *ptr;

Questo crea un puntatore chiamato ptr che può memorizzare l'indirizzo di una struct Point. Per fare in modo che il puntatore punti effettivamente alla nostra variabile struct, usi l'operatore di indirizzo:

ptr = &p1;

Per leggere un membro tramite il puntatore, dereferenzialo e poi usa l'operatore punto. Le parentesi sono necessarie, perché . ha una precedenza maggiore di *:

printf("%d", (*ptr).x); // uguale a p1.x

Ora ptr contiene l'indirizzo di memoria della variabile struct p1. Questo apre nuove possibilità per lavorare con le struct, specialmente quando le si passano alle funzioni o si gestisce la memoria dinamicamente. I puntatori alle struct sono essenziali per creare strutture dati più complesse e scrivere programmi C efficienti.

challenge icon

Sfida

Facile

Crea un programma C che dimostri l’uso dei puntatori a struct. Il tuo programma dovrebbe:

  1. Definire una struct chiamata Product con i seguenti membri:
    • Un intero id per memorizzare l’ID del prodotto
    • Un array di caratteri name di dimensione 25 per memorizzare il nome del prodotto
    • Un float price per memorizzare il prezzo del prodotto
    • Un intero quantity per memorizzare la quantità disponibile
  2. Nella funzione main, crea una variabile Product chiamata item e inizializzala con i seguenti valori:
    • ID: 501
    • Nome: "Laptop"
    • Prezzo: 899.99
    • Quantità: 15
  3. Dichiara un puntatore a una struct Product chiamato itemPtr
  4. Assegna l’indirizzo della variabile item a itemPtr usando l’operatore indirizzo
  5. Stampa le informazioni originali sul prodotto accedendo direttamente ai membri della struct (usando l’operatore punto) in questo formato esatto:
    • Original Product Info:
    • ID: [id]
    • Name: [name]
    • Price: [price]
    • Quantity: [quantity]
  6. Stampa le stesse informazioni sul prodotto accedendo ai membri della struct tramite il puntatore (usando l’operatore di dereferenziazione e la notazione con il punto: (*itemPtr).member) in questo formato esatto:
    • Product Info via Pointer:
    • ID: [id]
    • Name: [name]
    • Price: [price]
    • Quantity: [quantity]
  7. Verifica che il puntatore punti correttamente alla struct stampando gli indirizzi di memoria in questo formato esatto:
    • Address of item: [address]
    • Value of itemPtr: [address]
    • Address verification: [result]

Per la verifica dell’indirizzo, stampa Match se gli indirizzi sono uguali oppure No Match se sono diversi.

Questa sfida mette alla prova la tua comprensione della dichiarazione di un puntatore a struct, dell’assegnazione dell’indirizzo usando l’operatore indirizzo e dell’accesso ai membri della struct tramite puntatori usando l’operatore di dereferenziazione insieme alla notazione con il punto. Verificherai anche che il puntatore contenga correttamente l’indirizzo della variabile struct.

Provalo tu

#include <stdio.h>
#include <string.h>

// TODO: Definisci qui la struct Product

int main() {
    // TODO: Scrivi qui il tuo codice
    // 1. Crea e inizializza la variabile Product 'item'
    // 2. Dichiara un puntatore a Product chiamato 'itemPtr'
    // 3. Assegna l'indirizzo di 'item' a 'itemPtr'
    // 4. Stampa le informazioni originali del prodotto usando l'operatore punto
    // 5. Stampa le informazioni del prodotto tramite il puntatore usando (*itemPtr).member
    // 6. Stampa e verifica gli indirizzi
    
    return 0;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore C online