Programmation en C – Arithmétique des pointeurs
Un pointeur en C est une adresse, qui possède une valeur numérique. Donc, vous pouvez effectuer des opérations arithmétiques sur des pointeurs comme vous le pouvez sur des valeurs numériques. Quatre opérateurs arithmétiques peuvent être utilisés sur les pointeurs: ++, -, + et –
Pour comprendre l’arithmétique du pointeur, considérons que p est un pointeur entier qui pointe vers l’adresse 1000. En supposant que des entiers en 32 bits, effectuons l’opération arithmétique suivante sur le pointeur p++ Le pointeur pointera sur l’emplacement 1004 car chaque fois que p est incrémenté, il pointera sur l’emplacement entier suivant qui est de 4 octets à côté de l’emplacement actuel. Cette opération déplace le pointeur vers l’emplacement de mémoire suivant sans affecter la valeur actuelle. Si p pointe sur un caractère dont l’adresse est 1000, alors l’opération ci-dessus pointera vers l’emplacement 1001 car le caractère suivant sera disponible à partir de 1001.
Incrémenter un pointeur
Nous préférons utiliser un pointeur dans notre programme au lieu d’un tableau car un pointeur peut être incrémenté, contrairement au tableau qui ne peut pas être incrémenté car il s’agit d’un pointeur constant. Le programme suivant incrémente le pointeur de variable pour accéder à chaque élément suivant du tableau
#include <stdio.h> const int MAX = 4; int main () { int tab[] = {10, 100, 1000}; int i, *p; /* mettons l'adresse du tableau dans le pointeur */ p = tab; for ( i = 0; i < MAX; i++) { printf("Adresse de tab[%d] = %xn", i, p); printf("Valeur de tab[%d] = %dn", i, *p); /* passer à l'emplacement suivant */ p++; } return 0; }
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :
Adresse de tab[0] = 478e0614 Valeur de tab[0] = 10 Adresse de tab[1] = 478e0618 Valeur de tab[1] = 100 Adresse de tab[2] = 478e061c Valeur de tab[2] = 1000 Adresse de tab[3] = 478e0620 Valeur de tab[3] = 1200490016
Décrémenter un pointeur
Les mêmes concepts s’appliquent à la décrémentation d’un pointeur, qui diminue sa valeur par le nombre d’octets de son type de données comme indiqué ci-dessous
#include <stdio.h> const int MAX = 4; int main () { int tab[] = {10, 100, 1000}; int i, *p; /* mettons l'adresse du tableau dans le pointeur */ p = &tab[MAX-1]; for ( i = MAX; i > 0; i--) { printf("Adresse de tab[%d] = %xn", i-1, p ); printf("Valeur de tab[%d] = %dn", i-1, *p ); /* passe à l'emplacement précédent */ p--; } return 0; }
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :
Adresse de tab[3] = 17dbdca0 Valeur de tab[3] = 400284832 Adresse de tab[2] = 17dbdc9c Valeur de tab[2] = 1000 Adresse de tab[1] = 17dbdc98 Valeur de tab[1] = 100 Adresse de tab[0] = 17dbdc94 Valeur de tab[0] = 10
Comparaisons de pointeurs
Les pointeurs peuvent être comparés en utilisant des opérateurs relationnels, tels que ==, < et >. Si p1 et p2 pointent vers des variables liées les unes aux autres, comme des éléments du même tableau, p1 et p2 peuvent être comparés de manière significative.
Le programme suivant modifie l’exemple précédent – en incrémentant le pointeur de variable tant que l’adresse vers laquelle il pointe est inférieure ou égale à l’adresse du dernier élément du tableau, qui est &tab[MAX-1]
#include <stdio.h> const int MAX = 4; int main () { int tab[] = {20, 200, 2000}; int i, *p; /* prenons l'adresse du premier élément dans le pointeur */ p = tab; i = 0; while ( p <= &tab[MAX - 1] ) { printf("Adresse de tab[%d] = %xn", i, p); printf("Valeur de tab[%d] = %dn", i, *p); /* pointe vers l'emplacement précédent */ p++; i++; } return 0; }
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :
Adresse de tab[0] = de156234 Valeur de tab[0] = 20 Adresse de tab[1] = de156238 Valeur de tab[1] = 200 Adresse de tab[2] = de15623c Valeur de tab[2] = 2000 Adresse de tab[3] = de156240 Valeur de tab[3] = -569023936