C - Arithmétique du pointeur

Un pointeur en c est une adresse, qui est une valeur numérique. Par conséquent, vous pouvez effectuer des opérations arithmétiques sur un pointeur comme vous le pouvez sur une valeur numérique. Il existe quatre opérateurs arithmétiques qui peuvent être utilisés sur les pointeurs: ++, -, + et -

Pour comprendre l'arithmétique des pointeurs, considérons que ptr est un pointeur entier qui pointe vers l'adresse 1000. En supposant des entiers de 32 bits, effectuons l'opération arithmétique suivante sur le pointeur -

ptr++

Après l'opération ci-dessus, le ptrpointera vers l'emplacement 1004 car chaque fois que ptr est incrémenté, il pointera vers l'emplacement entier suivant qui est de 4 octets à côté de l'emplacement actuel. Cette opération déplacera le pointeur vers l'emplacement mémoire suivant sans affecter la valeur réelle à l'emplacement mémoire. Siptr pointe vers 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 à 1001.

Incrémenter un pointeur

Nous préférons utiliser un pointeur dans notre programme au lieu d'un tableau car le pointeur de variable peut être incrémenté, contrairement au nom du 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 = 3;

int main () {

   int  var[] = {10, 100, 200};
   int  i, *ptr;

   /* let us have array address in pointer */
   ptr = var;
	
   for ( i = 0; i < MAX; i++) {

      printf("Address of var[%d] = %x\n", i, ptr );
      printf("Value of var[%d] = %d\n", i, *ptr );

      /* move to the next location */
      ptr++;
   }
	
   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Address of var[0] = bf882b30
Value of var[0] = 10
Address of var[1] = bf882b34
Value of var[1] = 100
Address of var[2] = bf882b38
Value of var[2] = 200

Décrémenter un pointeur

Les mêmes considérations s'appliquent à la décrémentation d'un pointeur, qui diminue sa valeur du nombre d'octets de son type de données comme indiqué ci-dessous -

#include <stdio.h>

const int MAX = 3;

int main () {

   int  var[] = {10, 100, 200};
   int  i, *ptr;

   /* let us have array address in pointer */
   ptr = &var[MAX-1];
	
   for ( i = MAX; i > 0; i--) {

      printf("Address of var[%d] = %x\n", i-1, ptr );
      printf("Value of var[%d] = %d\n", i-1, *ptr );

      /* move to the previous location */
      ptr--;
   }
	
   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Address of var[2] = bfedbcd8
Value of var[2] = 200
Address of var[1] = bfedbcd4
Value of var[1] = 100
Address of var[0] = bfedbcd0
Value of var[0] = 10

Comparaisons de pointeurs

Les pointeurs peuvent être comparés à l'aide d'opérateurs relationnels, tels que ==, <et>. Si p1 et p2 pointent vers des variables qui sont liées les unes aux autres, telles que des éléments du même tableau, alors p1 et p2 peuvent être comparés de manière significative.

Le programme suivant modifie l'exemple précédent - un en incrémentant le pointeur de variable tant que l'adresse vers laquelle il pointe est soit inférieure ou égale à l'adresse du dernier élément du tableau, qui est & var [MAX - 1] -

#include <stdio.h>

const int MAX = 3;

int main () {

   int  var[] = {10, 100, 200};
   int  i, *ptr;

   /* let us have address of the first element in pointer */
   ptr = var;
   i = 0;
	
   while ( ptr <= &var[MAX - 1] ) {

      printf("Address of var[%d] = %x\n", i, ptr );
      printf("Value of var[%d] = %d\n", i, *ptr );

      /* point to the next location */
      ptr++;
      i++;
   }
	
   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Address of var[0] = bfdbcb20
Value of var[0] = 10
Address of var[1] = bfdbcb24
Value of var[1] = 100
Address of var[2] = bfdbcb28
Value of var[2] = 200