Comparaison de pointeurs
Fait partie de la section Logic & Flow du Journey C de Coddy — leçon 10 sur 63.
Vous avez appris à parcourir des tableaux en utilisant l'arithmétique des pointeurs. Maintenant, vous allez découvrir que les pointeurs peuvent également être comparés en utilisant les mêmes opérateurs relationnels que vous utilisez avec des variables ordinaires : ==, !=, < et >.
Lorsque vous comparez deux pointeurs, vous comparez leurs adresses mémoire. C'est particulièrement utile lorsque les deux pointeurs pointent vers des éléments du même tableau, car cela vous permet de déterminer leurs positions relatives en mémoire.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // Pointe vers le premier élément
int *end = numbers + 4; // Pointe vers le dernier élément
if (start < end) {
printf("start comes before end in memory");
}La comparaison de pointeurs devient particulièrement puissante dans les conditions de boucle. Au lieu d'utiliser une variable de compteur, vous pouvez comparer la position actuelle de votre pointeur avec un pointeur cible pour contrôler l'arrêt de la boucle. Cela permet de créer un code élégant et efficace pour le parcours de tableaux.
L'idée clé est que ptr1 < ptr2 vous indique que ptr1 pointe vers un élément qui apparaît plus tôt dans le tableau que l'élément vers lequel ptr2 pointe. Cette relation fait de la comparaison de pointeurs un choix naturel pour contrôler les boucles qui traitent les tableaux de manière séquentielle.
Défi
FacileÉcrivez un programme C qui utilise la comparaison de pointeurs pour parcourir un tableau et trouver des éléments dans une plage spécifique. Votre programme doit :
- Déclarer un tableau d'entiers nommé
scoresavec 8 éléments et l'initialiser avec les valeurs {45, 78, 92, 63, 87, 34, 91, 56} - Déclarer deux pointeurs vers des entiers :
start_ptretend_ptr - Définir
start_ptrpour qu'il pointe vers le premier élément du tableau - Définir
end_ptrpour qu'il pointe vers le dernier élément du tableau en utilisant l'arithmétique de pointeurs - Déclarer un pointeur nommé
current_ptret l'initialiser pour qu'il pointe vers le premier élément - Utiliser une boucle while avec une comparaison de pointeurs (
current_ptr <= end_ptr) pour parcourir le tableau - À l'intérieur de la boucle :
- Vérifier si la valeur actuelle est comprise entre 60 et 90 (inclus)
- Si la valeur est dans la plage, afficher "Value %d is in range"
- Si la valeur n'est pas dans la plage, afficher "Value %d is out of range"
- Incrémenter
current_ptrpour passer à l'élément suivant
- Après la boucle, utiliser la comparaison de pointeurs pour vérifier que
current_ptrest maintenant au-delà de la fin du tableau en vérifiant sicurrent_ptr > end_ptr - Si la condition est vraie, afficher "Traversal complete"
Votre sortie doit afficher les résultats au format suivant :
Value 45 is out of range
Value 78 is in range
Value 92 is out of range
Value 63 is in range
Value 87 is in range
Value 34 is out of range
Value 91 is out of range
Value 56 is out of range
Traversal completeCe défi teste votre compréhension des opérateurs de comparaison de pointeurs dans les conditions de boucle, l'utilisation de l'arithmétique de pointeurs pour définir des pointeurs de limite, et comment la comparaison de pointeurs peut contrôler le parcours d'un tableau de manière plus élégante que les boucles traditionnelles basées sur des compteurs.
Aide-mémoire
Les pointeurs peuvent être comparés à l'aide d'opérateurs relationnels : ==, !=, <, et >.
Lors de la comparaison de pointeurs, vous comparez leurs adresses mémoire. Cela est utile pour déterminer les positions relatives des éléments au sein d'un même tableau.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // Pointe vers le premier élément
int *end = numbers + 4; // Pointe vers le dernier élément
if (start < end) {
printf("start comes before end in memory");
}La comparaison de pointeurs est particulièrement puissante dans les conditions de boucle, vous permettant de contrôler les boucles en comparant les positions des pointeurs au lieu d'utiliser des variables de compteur :
int *current_ptr = numbers;
int *end_ptr = numbers + 4;
while (current_ptr <= end_ptr) {
// Traiter l'élément actuel
current_ptr++; // Passer à l'élément suivant
}L'expression ptr1 < ptr2 signifie que ptr1 pointe vers un élément qui apparaît plus tôt dans le tableau que l'élément vers lequel ptr2 pointe.
Essayez vous-même
#include <stdio.h>
int main() {
// À FAIRE : Écrivez votre code ci-dessous
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