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
Padronanza delle Struct in C

bookPuntatori All'interno Delle Struct

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.

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 quando si determina la dimensione di una 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 concetto nella pratica.

main.c

main.c

copy
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à finché 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?

Select the correct answer

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

bookPuntatori 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.

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 quando si determina la dimensione di una 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 concetto nella pratica.

main.c

main.c

copy
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à finché 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?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 3
some-alt