Puntatori a struct
Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 44 di 63.
Ora che hai acquisito dimestichezza con le 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, usa l'operatore di indirizzo:
ptr = &p1;Ora ptr contiene l'indirizzo di memoria della variabile struct p1. Questo apre nuove possibilità per lavorare con le struct, soprattutto quando le passi alle funzioni o gestisci la memoria in modo dinamico. I puntatori alle struct sono essenziali per creare strutture dati più complesse e scrivere programmi C efficienti.
Sfida
FacileCrea un programma in C che dimostri l’uso dei puntatori a struct. Il tuo programma deve:
- Definire una
structdenominataProductcon i seguenti membri:- Un intero
idper memorizzare l’ID del prodotto - Un array di caratteri
namedi dimensione 25 per memorizzare il nome del prodotto - Un float
priceper memorizzare il prezzo del prodotto - Un intero
quantityper memorizzare la quantità disponibile
- Un intero
- Nella funzione principale, creare una variabile
Productdenominataiteme inizializzarla con i seguenti valori:- ID: 501
- Nome: "Laptop"
- Prezzo: 899.99
- Quantità: 15
- Dichiarare un puntatore a una struct
ProductdenominatoitemPtr - Assegnare l’indirizzo della variabile
itemaitemPtrusando l’operatore di indirizzo - Stampare le informazioni originali del 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]
- Stampare le stesse informazioni del 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]
- Verificare 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, stampare Match se gli indirizzi sono uguali oppure No Match se sono diversi.
Questa sfida verifica la tua comprensione della dichiarazione di un puntatore a una struct, dell’assegnazione dell’indirizzo usando l’operatore di indirizzo e dell’accesso ai membri della struct tramite puntatori usando l’operatore di dereferenziazione insieme alla notazione con il punto. Verificherai inoltre 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;
}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 funzioni3Array 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