Objective-C - Pointer Aritmética

Conforme explicado no capítulo principal, o ponteiro Objective-C é um endereço, que é um valor numérico. Portanto, você pode realizar operações aritméticas em um ponteiro da mesma forma que em um valor numérico. Existem quatro operadores aritméticos que podem ser usados ​​em ponteiros: ++, -, + e -

Para entender a aritmética de ponteiros, vamos considerar que ptr é um ponteiro inteiro, que aponta para o endereço 1000. Assumindo números inteiros de 32 bits, vamos realizar a seguinte operação aritmética no ponteiro -

ptr++

Agora, após a operação acima, o ptrirá apontar para a localização 1004 porque cada vez que ptr é incrementado, ele irá apontar para a próxima localização de inteiro, que é 4 bytes próximo à localização atual. Esta operação moverá o ponteiro para o próximo local da memória sem afetar o valor real no local da memória. E septr aponta para um caractere cujo endereço é 1000, a operação acima apontará para o local 1001 porque o próximo caractere estará disponível em 1001.

Incrementando um Ponteiro

Preferimos usar um ponteiro em nosso programa em vez de um array porque o ponteiro variável pode ser incrementado, ao contrário do nome do array que não pode ser incrementado porque é um ponteiro constante. O programa a seguir incrementa o ponteiro variável para acessar cada elemento sucessivo da 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;
}

Quando o código acima é compilado e executado, ele produz um resultado como o seguinte -

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

Decrementando um Ponteiro

As mesmas considerações se aplicam à diminuição de um ponteiro, o que diminui seu valor pelo número de bytes de seu tipo de dados, conforme mostrado abaixo -

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

Quando o código acima é compilado e executado, ele produz um resultado como o seguinte -

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

Comparações de Ponteiros

Os ponteiros podem ser comparados usando operadores relacionais, como ==, <e>. Se p1 e p2 apontam para variáveis ​​que estão relacionadas entre si, como elementos da mesma matriz, então p1 e p2 podem ser comparados de forma significativa.

O programa a seguir modifica o exemplo anterior incrementando o ponteiro da variável, desde que o endereço para o qual ele aponta seja menor ou igual ao endereço do último elemento da matriz, que é & 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;
}

Quando o código acima é compilado e executado, ele produz um resultado como o seguinte -

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