Pointeurs vers des structures
Fait partie de la section Logic & Flow du Journey C de Coddy — leçon 44 sur 63.
Maintenant que vous êtes à l'aise avec les structures, il est temps de les combiner avec un autre concept puissant du C : les pointeurs. Tout comme vous pouvez créer des pointeurs vers des types de données de base comme int ou char, vous pouvez également créer des pointeurs qui contiennent l'adresse d'une variable de type struct.
La syntaxe pour déclarer un pointeur vers une structure suit le même modèle que les autres déclarations de pointeurs :
struct StructureName *pointerName;Par exemple, en utilisant notre structure Point familière :
struct Point p1 = {10, 20};
struct Point *ptr;Ceci crée un pointeur nommé ptr qui peut stocker l'adresse d'une structure Point. Pour que le pointeur pointe effectivement vers notre variable de structure, vous utilisez l'opérateur d'adresse :
ptr = &p1;Maintenant, ptr contient l'adresse mémoire de la variable struct p1. Cela ouvre de nouvelles possibilités pour travailler avec des structures, en particulier lors de leur passage à des fonctions ou de la gestion dynamique de la mémoire. Les pointeurs vers des structures sont essentiels pour construire des structures de données plus complexes et écrire des programmes C efficaces.
Défi
FacileCréez un programme C qui démontre l'utilisation de pointeurs vers des structures. Votre programme doit :
- Définir une
structnomméeProductavec les membres suivants :- Un entier
idpour stocker l'ID du produit - Un tableau de caractères
namede taille 25 pour stocker le nom du produit - Un flottant
pricepour stocker le prix du produit - Un entier
quantitypour stocker la quantité disponible
- Un entier
- Dans la fonction principale, créer une variable
Productnomméeitemet l'initialiser avec les valeurs suivantes :- ID : 501
- Nom : "Laptop"
- Prix : 899.99
- Quantité : 15
- Déclarer un pointeur vers une structure
ProductnomméitemPtr - Assigner l'adresse de la variable
itemàitemPtren utilisant l'opérateur d'adresse - Afficher les informations originales du produit en accédant directement aux membres de la structure (en utilisant l'opérateur point) dans ce format exact :
Original Product Info:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Afficher les mêmes informations du produit en accédant aux membres de la structure via le pointeur (en utilisant l'opérateur de déréférencement et la notation point :
(*itemPtr).member) dans ce format exact :Product Info via Pointer:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Vérifier que le pointeur pointe correctement vers la structure en affichant les adresses mémoire dans ce format exact :
Address of item: [address]Value of itemPtr: [address]Address verification: [result]
Pour la vérification de l'adresse, affichez Match si les adresses sont identiques, ou No Match si elles sont différentes.
Ce défi teste votre compréhension de la déclaration de pointeur vers une structure, de l'assignation d'adresse à l'aide de l'opérateur d'adresse et de l'accès aux membres d'une structure via des pointeurs en utilisant l'opérateur de déréférencement combiné à la notation point. Vous vérifierez également que le pointeur contient correctement l'adresse de la variable de structure.
Aide-mémoire
Vous pouvez créer des pointeurs vers des structures en utilisant la même syntaxe que pour les autres déclarations de pointeurs :
struct StructureName *pointerName;Pour faire pointer un pointeur vers une variable de structure, utilisez l'opérateur d'adresse :
struct Point p1 = {10, 20};
struct Point *ptr;
ptr = &p1;Accédez aux membres de la structure via un pointeur en utilisant l'opérateur de déréférencement et la notation par point :
(*ptr).memberEssayez vous-même
#include <stdio.h>
#include <string.h>
// À FAIRE : Définir la structure Product ici
int main() {
// À FAIRE : Écrivez votre code ici
// 1. Créer et initialiser la variable Product 'item'
// 2. Déclarer un pointeur vers Product nommé 'itemPtr'
// 3. Assigner l'adresse de 'item' à 'itemPtr'
// 4. Afficher les informations originales du produit en utilisant l'opérateur point
// 5. Afficher les informations du produit via le pointeur en utilisant (*itemPtr).member
// 6. Afficher et vérifier les adresses
return 0;
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logic & Flow
1Les bases des pointeurs
Qu'est-ce qu'un pointeur ?Déclaration de pointeursL'opérateur d'adresse (&)L'opérateur de déréférencement (*)Pointeurs NULLRécapitulatif : Les bases des pointeurs4Projet : Utilitaire de texte simple
Présentation du projetCompter les caractères2Pointeurs et Tableaux
Noms de tableaux comme pointeursÉléments de tableau - PointeursArithmétique des pointeursComparaison de pointeursRécapitulatif : Parcours de tableau par pointeur5Pointeurs et fonctions
Passage par valeurPassage de pointeurs aux fonctionsModifier des variables via des pointeursUn exemple classique : SwapPassage de tableaux aux fonctionsRécapitulatif : Pointeurs comme arguments de fonction8Structures et Pointeurs
Pointeurs vers des structuresL'opérateur flèche (->)Passage de structures par valeurPassage de pointeurs de structuresAllocation dynamique de structuresRécap : Modifier une structure - Ptr3Tableaux de caractères et chaînes
Les chaînes comme tableaux de charLe terminateur nulSaisie de chaînes avec scanfUtilisation de strlen()Utilisation de strcpy()Utilisation de strcat()Utilisation de strcmp()Récapitulatif : Fonctions de base sur les chaînes