Arithmétique des pointeurs en C ++
Un pointeur est une adresse numérique; Donc, vous pouvez effectuer des opérations arithmétiques sur un pointeur et il existe quatre opérateurs arithmétiques qui peuvent être utilisés sur les pointeurs: ++, -, + et –
Pour comprendre l’arithmétique du pointeur, considérons que p est un pointeur entier(de type int) qui pointe vers l’adresse 1000. En supposant des entiers de 32 bits, effectuons l’opération arithmétique suivante sur le pointeur:
p++
Le pointeur p pointera vers l’emplacement 1004 parce que chaque fois que ptr est incrémenté, il pointe vers l’entier suivant. Cette opération déplacera le pointeur vers l’emplacement mémoire suivant sans affecter la valeur qui dans l’emplacement mémoire. Si p pointe vers un caractère dont l’adresse est 1000, l’opération ci-dessus pointe vers l’emplacement 1001 car le caractère suivant sera disponible à 1001.
Incrémenter un pointeur
Nous préférons utiliser un pointeur dans notre programme au lieu d’un tableau car le pointeur peut être incrémenté, contrairement au nom du tableau qui ne peut être incrémenté car il s’agit d’un pointeur constant. Le programme suivant incrémente le pointeur pour accéder à chaque élément successif du tableau:
#include <iostream> using namespace std; const int MAX = 3; int main () { int v[MAX] = {33, 333, 2019}; int *p; // stocker l'adresse du tableau v dans le pointeur p. p = v; for (int i = 0; i < MAX; i++) { cout << "Adresse de v [" << i << "] = "; cout << p << endl; cout << "Valeur de v[" << i << "] = "; cout << *p << endl; // p pointe vers l'emplacement suivant p++; } return 0; }
La sortie :
Adresse de v [0] = 0x7fff819521e0 Valeur de v[0] = 33 Adresse de v [1] = 0x7fff819521e4 Valeur de v[1] = 333 Adresse de v [2] = 0x7fff819521e8 Valeur de v[2] = 2019
Décrémenter un pointeur:
C’est comme l’incrémentation sauf la valeur du pointeur sera diminue par le nombre d’octets de son type de données comme indiqué ci-dessous:
#include <iostream> using namespace std; const int MAX = 3; int main () { int v[MAX] = {33, 333, 2019}; int *p; // nous avons l'adresse du dernier élément du pointeur. p = &v[MAX-1]; for (int i = MAX; i > 0; i--) { cout << "Adresse de v [" << i << "] = "; cout << p << endl; cout << "Valeur de v[" << i << "] = "; cout << *p << endl; // p pointe vers l'emplacement précédent p--; } return 0; }
La sortie :
Adresse de v [3] = 0x7ffe8d9161f8 Valeur de v[3] = 2019 Adresse de v [2] = 0x7ffe8d9161f4 Valeur de v[2] = 333 Adresse de v [1] = 0x7ffe8d9161f0 Valeur de v[1] = 33
Comparaisons de pointeurs
Les pointeurs peuvent être comparés en utilisant des opérateurs relationnels, tels que ==, <, et >. Si p1 et p2 désignent des variables qui sont liées les unes aux autres, telles que des éléments d’une même matrice, alors p1 et p2 peuvent être significativement comparés.
Le programme suivant modifie l’exemple précédent en incrémentant le pointeur tant que l’adresse à laquelle il pointe est inférieure ou égale à l’adresse du dernier élément du tableau, qui est &v [MAX-1]:
#include <iostream> using namespace std; const int MAX = 3; int main () { int v[MAX] = {33, 333, 2019}; int *p; // nous avons l'adresse du premier élément dans le pointeur. p = v; int i = 0; while ( p <= &v[MAX - 1] ) { cout << "Adresse de v[" << i << "] = "; cout << p << endl; cout << "Valeur de v[" << i << "] = "; cout << *p << endl; // pointe vers l'emplacement précédent p++; i++; } return 0; }
La sortie :
Adresse de v[0] = 0x7ffce5541ac0 Valeur de v[0] = 33 Adresse de v[1] = 0x7ffce5541ac4 Valeur de v[1] = 333 Adresse de v[2] = 0x7ffce5541ac8 Valeur de v[2] = 2019