Objective-C - Pointer Arithmetic

Come spiegato nel capitolo principale, il puntatore Objective-C è un indirizzo, che è un valore numerico. Pertanto, è possibile eseguire operazioni aritmetiche su un puntatore proprio come è possibile su un valore numerico. Ci sono quattro operatori aritmetici che possono essere usati sui puntatori: ++, -, + e -

Per comprendere l'aritmetica dei puntatori, consideriamolo ptr è un puntatore intero, che punta all'indirizzo 1000. Assumendo interi a 32 bit, eseguiamo la seguente operazione aritmetica sul puntatore:

ptr++

Ora, dopo l'operazione di cui sopra, il file ptrpunterà alla posizione 1004 perché ogni volta che ptr viene incrementato, punterà alla successiva posizione intera, che è di 4 byte accanto alla posizione corrente. Questa operazione sposterà il puntatore alla posizione di memoria successiva senza influire sul valore effettivo nella posizione di memoria. Septr punta a un carattere il cui indirizzo è 1000, quindi l'operazione precedente punterà alla posizione 1001 perché il carattere successivo sarà disponibile a 1001.

Incremento di un puntatore

Preferiamo usare un puntatore nel nostro programma invece di un array perché il puntatore della variabile può essere incrementato, a differenza del nome dell'array che non può essere incrementato perché è un puntatore costante. Il seguente programma incrementa il puntatore della variabile per accedere a ogni elemento successivo dell'array -

#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 il codice precedente viene compilato ed eseguito, produce un risultato come segue:

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

Decremento di un puntatore

Le stesse considerazioni si applicano al decremento di un puntatore, che diminuisce il suo valore del numero di byte del suo tipo di dati come mostrato di seguito -

#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 il codice precedente viene compilato ed eseguito, produce un risultato come segue:

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

Confronti di puntatori

I puntatori possono essere confrontati utilizzando operatori relazionali, come ==, <e>. Se p1 e p2 puntano a variabili correlate tra loro, come elementi dello stesso array, allora p1 e p2 possono essere confrontati in modo significativo.

Il seguente programma modifica il precedente esempio incrementando il puntatore della variabile fintanto che l'indirizzo a cui punta è minore o uguale all'indirizzo dell'ultimo elemento dell'array, che è & 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 il codice precedente viene compilato ed eseguito, produce un risultato come segue:

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