Pointeurs à l'Intérieur des Structures
Des structures de données essentielles telles que les piles, listes chaînées et arbres peuvent contenir des références à d'autres objets du même type afin de créer des connexions ou des relations entre les éléments. Les structures de données seront abordées plus loin dans ce cours.
Les éléments de telles structures de données sont généralement appelés nœuds.
Si vous essayez de créer une structure contenant un champ du même type que la structure elle-même, vous obtiendrez une erreur :
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
Dans ce cas, une récursion infinie se produit lors de la détermination de la taille d'une telle structure.
Cette idée peut être mise en œuvre à l'aide d'un pointeur vers une structure :
struct Node {
int data;
struct Node *next; // pointer to the `Node` structure
};
Ce code fonctionne car le compilateur connaît la taille exacte d'un pointeur — généralement 4 ou 8 octets, selon le système.
Il n'essaie pas de calculer la taille de l'ensemble de la structure imbriquée ; il stocke simplement une référence (address) vers celle-ci.
Voyons comment cela fonctionne en pratique.
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" }; - le champ next n'a pas été initialisé explicitement dans l'initialiseur de structure, il sera automatiquement initialisé à un pointeur nul (NULL), car il s'agit de la valeur standard pour les pointeurs lorsqu'ils ne pointent vers aucun objet.
while (pointer != NULL) - la boucle s'exécutera tant que le pointeur ne pointe pas vers l'adresse NULL.
Dans les langages de programmation tels que C et C++, un pointeur NULL signifie généralement la fin d'une liste (ou d'une autre structure de données). Par conséquent, cette boucle s'exécutera jusqu'à ce que pointer soit NULL, ce qui peut être interprété comme l'atteinte de la fin de la liste ou de la structure de données.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Can you explain why using a pointer solves the recursion problem?
What are some real-world examples of using linked lists or similar structures?
Can you show how to traverse a linked list in C?
Génial!
Completion taux amélioré à 4.35
Pointeurs à l'Intérieur des Structures
Glissez pour afficher le menu
Des structures de données essentielles telles que les piles, listes chaînées et arbres peuvent contenir des références à d'autres objets du même type afin de créer des connexions ou des relations entre les éléments. Les structures de données seront abordées plus loin dans ce cours.
Les éléments de telles structures de données sont généralement appelés nœuds.
Si vous essayez de créer une structure contenant un champ du même type que la structure elle-même, vous obtiendrez une erreur :
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
Dans ce cas, une récursion infinie se produit lors de la détermination de la taille d'une telle structure.
Cette idée peut être mise en œuvre à l'aide d'un pointeur vers une structure :
struct Node {
int data;
struct Node *next; // pointer to the `Node` structure
};
Ce code fonctionne car le compilateur connaît la taille exacte d'un pointeur — généralement 4 ou 8 octets, selon le système.
Il n'essaie pas de calculer la taille de l'ensemble de la structure imbriquée ; il stocke simplement une référence (address) vers celle-ci.
Voyons comment cela fonctionne en pratique.
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" }; - le champ next n'a pas été initialisé explicitement dans l'initialiseur de structure, il sera automatiquement initialisé à un pointeur nul (NULL), car il s'agit de la valeur standard pour les pointeurs lorsqu'ils ne pointent vers aucun objet.
while (pointer != NULL) - la boucle s'exécutera tant que le pointeur ne pointe pas vers l'adresse NULL.
Dans les langages de programmation tels que C et C++, un pointeur NULL signifie généralement la fin d'une liste (ou d'une autre structure de données). Par conséquent, cette boucle s'exécutera jusqu'à ce que pointer soit NULL, ce qui peut être interprété comme l'atteinte de la fin de la liste ou de la structure de données.
Merci pour vos commentaires !