Puntatori 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.
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
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.
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.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
Fantastico!
Completion tasso migliorato a 4.35
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.
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
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.
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.
Grazie per i tuoi commenti!