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

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.