L'arithmétique des pointeurs en C et C++
Dans cette leçon, vous allez parcourir les éléments d'un tableau avec l'arithmétique des pointeurs en C et les itérateurs en C++.
Introduction
Quand on ajoute 1 à un pointeur, il n'avance pas d'un octet mais passe à l'élément suivant du tableau, car le compilateur calcule le déplacement selon la taille du type. On peut ainsi utiliser un pointeur pour parcourir une zone mémoire continue comme un tableau.
Points importants
- Un pointeur ne doit pointer que vers un objet qui existe encore, du bon type, ou valoir null.
- Chaque zone mémoire allouée doit être libérée exactement une fois.
- Indiquez clairement quelle fonction possède la mémoire (ownership) et quelles données sont seulement lues (const).
Exemples de code C et C++
#include <stdio.h>
int main(void) {
int values[] = {10, 20, 30, 40};
int sum = 0;
for (int *p = values; p < values + 4; ++p) sum += *p;
printf("sum=%d distance=%td\n", sum, (values + 4) - values);
return 0;
}
sum=100 distance=4
#include <iostream>
#include <vector>
int main() {
std::vector values{10, 20, 30, 40};
int sum = 0;
for (auto it = values.begin(); it != values.end(); ++it) sum += *it;
std::cout << "sum=" << sum << " distance="
<< std::distance(values.begin(), values.end()) << '\n';
}
sum=100 distance=4
Comparaison entre C et C++
La boucle démarre avec le pointeur p sur le premier élément et avance jusqu'à ce que p atteigne la position values + 4. À chaque étape, *p récupère la valeur courante pour l'ajouter au total. L'arithmétique des pointeurs n'est valide qu'à l'intérieur d'un même tableau, ou juste après son dernier élément. En C++, les itérateurs permettent de parcourir de la même façon de nombreux types de conteneurs.
La possession et la libération de la mémoire reposent entièrement sur le programmeur.
Les conteneurs et RAII libèrent automatiquement les ressources quand l'objet arrive en fin de vie.
Exercices d'approfondissement
Exécutez les deux versions, puis modifiez le code pour observer la différence de sécurité qu'apporte chaque langage.
- Testez avec des pointeurs nuls et des échecs d'allocation mémoire.
- Exécutez le programme avec AddressSanitizer et UndefinedBehaviorSanitizer pour détecter les erreurs mémoire.
- Indiquez clairement quel pointeur possède la mémoire et lequel sert seulement à lire.
S'entraîner avec un défi
Utilisez le contenu de cette leçon pour résoudre un vrai problème. Chaque défi s'exécute dans le navigateur, avec des tests instantanés et une revue par l'IA.
- Déplacer les zéros Déplacez chaque zéro à la fin tout en conservant l'ordre des autres éléments. Facile