Arithmétique des pointeurs
Fait partie de la section Logic & Flow du Journey C de Coddy — leçon 9 sur 63.
Vous avez appris à accéder aux éléments d'un tableau en utilisant la notation de pointeur comme *(array + i). Maintenant, vous allez découvrir une technique encore plus puissante : l'arithmétique des pointeurs, qui vous permet de déplacer des pointeurs dans la mémoire en utilisant de simples opérations d'incrémentation et de décrémentation.
Lorsque vous incrémentez un pointeur avec ++ ou que vous le décrémentez avec --, le pointeur ne se déplace pas simplement d'un octet. Au lieu de cela, il se déplace de la taille du type de données vers lequel il pointe. Pour un pointeur d'entier, ptr++ avance de sizeof(int) octets, arrivant exactement sur l'entier suivant en mémoire.
int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers; // Pointe vers le premier élément (10)
ptr++; // Pointe maintenant vers le deuxième élément (20)
ptr++; // Pointe maintenant vers le troisième élément (30)Ce calcul automatique de la taille est ce qui rend l'arithmétique des pointeurs si puissante et pratique. Vous n'avez pas à vous soucier des calculs d'octets - le C gère l'adressage mémoire pour vous en fonction du type de données du pointeur.
L'arithmétique des pointeurs est particulièrement utile pour parcourir des tableaux dans des boucles. Au lieu d'utiliser des indices de tableau, vous pouvez incrémenter un pointeur pour parcourir chaque élément de manière séquentielle, ce qui se traduit souvent par un code plus efficace.
Défi
FacileÉcrivez un programme en C qui démontre l'arithmétique des pointeurs en utilisant des opérations d'incrémentation de pointeur pour parcourir et traiter un tableau. Votre programme doit :
- Déclarer un tableau d'entiers nommé
dataavec 5 éléments et l'initialiser avec les valeurs {12, 24, 36, 48, 60} - Déclarer un pointeur vers un entier nommé
ptret l'initialiser pour qu'il pointe vers le premier élément du tableau - Utiliser une boucle for qui s'exécute 5 fois pour parcourir l'ensemble du tableau en utilisant uniquement l'arithmétique des pointeurs
- À l'intérieur de la boucle :
- Afficher la valeur actuelle vers laquelle
ptrpointe en utilisant l'opérateur de déréférencement - Afficher l'adresse mémoire stockée dans
ptren utilisant le spécificateur de format%p - Incrémenter le pointeur en utilisant
ptr++pour passer à l'élément suivant
- Afficher la valeur actuelle vers laquelle
- Après la boucle, réinitialiser
ptrpour qu'il pointe à nouveau vers le premier élément du tableau - Utiliser l'arithmétique des pointeurs pour accéder directement et afficher le troisième élément (index 2) en utilisant
*(ptr + 2) - Utiliser l'arithmétique des pointeurs pour accéder directement et afficher le dernier élément (index 4) en utilisant
*(ptr + 4)
Votre sortie doit afficher les résultats dans le format suivant :
Value: 12, Address: [address]
Value: 24, Address: [address]
Value: 36, Address: [address]
Value: 48, Address: [address]
Value: 60, Address: [address]
Third element: 36
Last element: 60Ce défi teste votre compréhension de la manière dont les opérations d'incrémentation de pointeur se déplacent automatiquement de la taille du type de données, et comment vous pouvez utiliser l'arithmétique des pointeurs pour accéder aux éléments d'un tableau à des décalages spécifiques par rapport à la position d'un pointeur de base.
Aide-mémoire
L'arithmétique des pointeurs vous permet de déplacer des pointeurs dans la mémoire à l'aide d'opérations d'incrémentation et de décrémentation. Lorsque vous incrémentez un pointeur, il se déplace de la taille du type de données vers lequel il pointe, et non d'un octet.
Opérations de base de l'arithmétique des pointeurs :
int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers; // Pointe vers le premier élément (10)
ptr++; // Pointe maintenant vers le deuxième élément (20)
ptr++; // Pointe maintenant vers le troisième élément (30)Vous pouvez également utiliser l'arithmétique des pointeurs pour accéder à des éléments à des décalages (offsets) spécifiques :
*(ptr + 2) // Accède à l'élément au décalage 2 à partir de la position actuelleL'arithmétique des pointeurs est utile pour parcourir des tableaux dans des boucles, ce qui permet souvent d'obtenir un code plus efficace que l'utilisation d'indices de tableau.
Essayez vous-même
#include <stdio.h>
int main() {
// TODO: Écrivez votre code ici
// Déclarer et initialiser le tableau 'data' avec les valeurs {12, 24, 36, 48, 60}
// Déclarer le pointeur 'ptr' et l'initialiser pour qu'il pointe vers le premier élément
// Utiliser une boucle for avec l'arithmétique de pointeurs pour parcourir le tableau
// Afficher chaque valeur et adresse, puis incrémenter le pointeur
// Réinitialiser le pointeur et utiliser l'arithmétique de pointeurs pour accéder à des éléments spécifiques
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 fonction3Tableaux 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