Objective-C - Aritmética de punteros

Como se explica en el capítulo principal, el puntero de Objective-C es una dirección, que es un valor numérico. Por lo tanto, puede realizar operaciones aritméticas con un puntero del mismo modo que con un valor numérico. Hay cuatro operadores aritméticos que se pueden usar en punteros: ++, -, + y -

Para entender la aritmética de punteros, consideremos que ptr es un puntero entero, que apunta a la dirección 1000. Suponiendo números enteros de 32 bits, realicemos la siguiente operación aritmética en el puntero:

ptr++

Ahora, después de la operación anterior, el ptrapuntará a la ubicación 1004 porque cada vez que se incremente ptr, apuntará a la siguiente ubicación entera, que está 4 bytes junto a la ubicación actual. Esta operación moverá el puntero a la siguiente ubicación de memoria sin afectar el valor real en la ubicación de memoria. Siptr apunta a un carácter cuya dirección es 1000, luego la operación anterior apuntará a la ubicación 1001 porque el próximo carácter estará disponible en 1001.

Incrementar un puntero

Preferimos usar un puntero en nuestro programa en lugar de una matriz porque el puntero variable se puede incrementar, a diferencia del nombre de la matriz que no se puede incrementar porque es un puntero constante. El siguiente programa incrementa el puntero de la variable para acceder a cada elemento sucesivo de la matriz:

#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;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

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

Disminuir un puntero

Las mismas consideraciones se aplican a la disminución de un puntero, que disminuye su valor por el número de bytes de su tipo de datos como se muestra a continuación:

#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;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

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

Comparaciones de punteros

Los punteros se pueden comparar utilizando operadores relacionales, como ==, <y>. Si p1 y p2 apuntan a variables que están relacionadas entre sí, como elementos de la misma matriz, entonces p1 y p2 se pueden comparar de manera significativa.

El siguiente programa modifica el ejemplo anterior incrementando el puntero de la variable siempre que la dirección a la que apunta sea menor o igual que la dirección del último elemento del arreglo, que es & 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;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

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