Objective-C - Arithmétique du pointeur

Comme expliqué dans le chapitre principal, le pointeur Objective-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++

Maintenant, 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 de mémoire suivant sans affecter la valeur réelle à l'emplacement de mémoire. Siptr pointe vers un caractère dont l'adresse est 1000, puis 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 -

#import <Foundation/Foundation.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++) {
      NSLog(@"Address of var[%d] = %x\n", i, ptr );
      NSLog(@"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 un résultat comme suit -

2013-09-14 00:08:36.215 demo[32000] Address of var[0] = 7e6f2a70
2013-09-14 00:08:36.216 demo[32000] Value of var[0] = 10
2013-09-14 00:08:36.216 demo[32000] Address of var[1] = 7e6f2a74
2013-09-14 00:08:36.216 demo[32000] Value of var[1] = 100
2013-09-14 00:08:36.216 demo[32000] Address of var[2] = 7e6f2a78
2013-09-14 00:08:36.216 demo[32000] 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 -

#import <Foundation/Foundation.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--) {
      NSLog(@"Address of var[%d] = %x\n", i, ptr );
      NSLog(@"Value of var[%d] = %d\n", i, *ptr );

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

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

2013-09-14 00:12:22.783 demo[13055] Address of var[3] = ea4c618
2013-09-14 00:12:22.783 demo[13055] Value of var[3] = 200
2013-09-14 00:12:22.783 demo[13055] Address of var[2] = ea4c614
2013-09-14 00:12:22.783 demo[13055] Value of var[2] = 100
2013-09-14 00:12:22.783 demo[13055] Address of var[1] = ea4c610
2013-09-14 00:12:22.783 demo[13055] Value of var[1] = 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 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 & var [MAX - 1] -

#import <Foundation/Foundation.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] ) {
      NSLog(@"Address of var[%d] = %x\n", i, ptr );
      NSLog(@"Value of var[%d] = %d\n", i, *ptr );

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

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

2013-09-14 00:15:49.976 demo[24825] Address of var[0] = ae1235a0
2013-09-14 00:15:49.976 demo[24825] Value of var[0] = 10
2013-09-14 00:15:49.977 demo[24825] Address of var[1] = ae1235a4
2013-09-14 00:15:49.977 demo[24825] Value of var[1] = 100
2013-09-14 00:15:49.977 demo[24825] Address of var[2] = ae1235a8
2013-09-14 00:15:49.977 demo[24825] Value of var[2] = 200