Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Puntatori all'interno delle struct | Lavorare con Puntatori e Struct
Struct in C

Puntatori all'interno delle struct

Scorri per mostrare il menu

Strutture dati essenziali come stack, liste collegate e alberi possono contenere riferimenti ad altri oggetti dello stesso tipo per creare connessioni o relazioni tra elementi. Le strutture dati saranno trattate più avanti in questo corso.

Note
Nota

Gli elementi di tali strutture dati sono solitamente chiamati nodi.

strutture+dati

Se si tenta di creare una struttura che contiene un campo dello stesso tipo della struttura stessa, si riceverà un errore:

struct Node {
    int data;
    struct Node next; // error: `Node` structure contains itself
};

In questo caso, si verifica una ricorsione infinita durante la determinazione della dimensione di tale struttura.

Questa idea può essere implementata utilizzando un puntatore a una struttura:

struct Node {
    int data;
    struct Node *next; // pointer to the `Node` structure
};

Questo codice funziona perché il compilatore conosce la dimensione esatta di un puntatore — solitamente 4 o 8 byte, a seconda del sistema.
Non cerca di calcolare la dimensione dell'intera struttura annidata; memorizza semplicemente un riferimento (address) ad essa.

Vediamo come funziona questo meccanismo nella pratica.

main.c

main.c

1234567891011121314151617181920212223242526
#include <stdio.h> struct Node { char name[20]; struct Node* next; }; int main() { struct Node Kate = { "Kate" }; struct Node Tom = { "Tom" }; struct Node Bob = { "Bob" }; Kate.next = &Tom; // Kate --> Tom Tom.next = &Bob; // Tom --> Bob // set a pointer to the first structure in the chain struct Node* pointer = &Kate; while (pointer != NULL) { printf("Address: %p | Name: %s-> | Next address: %p\n", pointer, pointer->name, pointer->next); pointer = pointer->next; // go to the next object } return 0; }

struct Node kate = { "Kate" }; - il campo next non è stato inizializzato esplicitamente nell'inizializzatore della struct, quindi verrà automaticamente inizializzato a un puntatore nullo (NULL), poiché questo è il valore standard per i puntatori quando non puntano a nessun oggetto.

while (pointer != NULL) - il ciclo continuerà fino a quando il puntatore punta all'indirizzo NULL.

Note
Nota

Nei linguaggi di programmazione come C e C++, un puntatore che è NULL di solito indica la fine di una lista (o di un'altra struttura dati). Pertanto, questo ciclo verrà eseguito fino a quando pointer è NULL, che può essere interpretato come il raggiungimento della fine della lista o della struttura dati.

question mark

Perché non possiamo creare una struttura che contiene sé stessa?

Seleziona la risposta corretta

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 3

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Sezione 2. Capitolo 3
some-alt