Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Pointeurs à l'Intérieur des Structures | Travail avec les Pointeurs et les Structures
Maîtriser les Structs en C

bookPointeurs à 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.

Note
Remarque

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

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" }; - 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.

Note
Remarque

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.

question mark

Pourquoi ne peut-on pas créer une structure qui se contient elle-même ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 3

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Suggested prompts:

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?

bookPointeurs à 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.

Note
Remarque

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

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" }; - 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.

Note
Remarque

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.

question mark

Pourquoi ne peut-on pas créer une structure qui se contient elle-même ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 3
some-alt