Puntatori Objective-C

I puntatori in Objective-C sono facili e divertenti da imparare. Alcune attività di programmazione Objective-C vengono eseguite più facilmente con i puntatori e altre attività, come l'allocazione dinamica della memoria, non possono essere eseguite senza utilizzare i puntatori. Quindi diventa necessario imparare i puntatori per diventare un perfetto programmatore Objective-C. Cominciamo ad apprenderli in passaggi semplici e facili.

Come sapete, ogni variabile è una posizione di memoria e ogni posizione di memoria ha il suo indirizzo definito a cui è possibile accedere utilizzando l'operatore e commerciale (&), che denota un indirizzo in memoria. Considera il seguente esempio, che stamperà l'indirizzo delle variabili definite:

#import <Foundation/Foundation.h>

int main () {
   int  var1;
   char var2[10];

   NSLog(@"Address of var1 variable: %x\n", &var1 );
   NSLog(@"Address of var2 variable: %x\n", &var2 );

   return 0;
}

Quando il codice precedente viene compilato ed eseguito, produce il risultato come segue:

2013-09-13 03:18:45.727 demo[17552] Address of var1 variable: 1c0843fc
2013-09-13 03:18:45.728 demo[17552] Address of var2 variable: 1c0843f0

Quindi, hai capito cos'è l'indirizzo di memoria e come accedervi, quindi la base del concetto è finita. Vediamo ora cos'è un puntatore.

Cosa sono i puntatori?

UN pointerè una variabile il cui valore è l'indirizzo di un'altra variabile, cioè l'indirizzo diretto della posizione di memoria. Come qualsiasi variabile o costante, è necessario dichiarare un puntatore prima di poterlo utilizzare per memorizzare qualsiasi indirizzo di variabile. La forma generale di una dichiarazione di variabile puntatore è:

type *var-name;

Qui, typeè il tipo base del puntatore; deve essere un tipo di dati Objective-C valido evar-nameè il nome della variabile del puntatore. L'asterisco * che hai usato per dichiarare un puntatore è lo stesso asterisco che usi per la moltiplicazione. Tuttavia, in questa istruzione l'asterisco viene utilizzato per designare una variabile come puntatore. Di seguito sono riportate le dichiarazioni di puntatore valide:

int    *ip;    /* pointer to an integer */
double *dp;    /* pointer to a double */
float  *fp;    /* pointer to a float */
char   *ch     /* pointer to a character */

Il tipo di dati effettivo del valore di tutti i puntatori, se intero, float, carattere o altro, è lo stesso, un numero esadecimale lungo che rappresenta un indirizzo di memoria. L'unica differenza tra i puntatori di diversi tipi di dati è il tipo di dati della variabile o della costante a cui punta il puntatore.

Come usare i puntatori?

Ci sono poche operazioni importanti, che faremo molto frequentemente con l'aiuto dei puntatori. (a) definiamo una variabile puntatore, (b) assegna l'indirizzo di una variabile a un puntatore e (c)accedere infine al valore all'indirizzo disponibile nella variabile pointer. Questo viene fatto utilizzando l'operatore unario*che restituisce il valore della variabile situata all'indirizzo specificato dal suo operando. L'esempio seguente fa uso di queste operazioni:

#import <Foundation/Foundation.h>

int main () {
   int  var = 20;    /* actual variable declaration */
   int  *ip;         /* pointer variable declaration */  
   ip = &var;       /* store address of var in pointer variable*/

   NSLog(@"Address of var variable: %x\n", &var  );

   /* address stored in pointer variable */
   NSLog(@"Address stored in ip variable: %x\n", ip );

   /* access the value using the pointer */
   NSLog(@"Value of *ip variable: %d\n", *ip );

   return 0;
}

Quando il codice precedente viene compilato ed eseguito, produce il risultato come segue:

2013-09-13 03:20:21.873 demo[24179] Address of var variable: 337ed41c
2013-09-13 03:20:21.873 demo[24179] Address stored in ip variable: 337ed41c
2013-09-13 03:20:21.874 demo[24179] Value of *ip variable: 20

Puntatori NULL in Objective-C

È sempre buona norma assegnare un valore NULL a una variabile puntatore nel caso in cui non si abbia l'indirizzo esatto da assegnare. Questo viene fatto al momento della dichiarazione della variabile. Un puntatore a cui è assegnato NULL è chiamato anull puntatore.

Il puntatore NULL è una costante con un valore zero definito in diverse librerie standard. Considera il seguente programma:

#import <Foundation/Foundation.h>

int main () {
   int  *ptr = NULL;
   NSLog(@"The value of ptr is : %x\n", ptr  );
   return 0;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

2013-09-13 03:21:19.447 demo[28027] The value of ptr is : 0

Nella maggior parte dei sistemi operativi, ai programmi non è consentito accedere alla memoria all'indirizzo 0 perché tale memoria è riservata dal sistema operativo. Tuttavia, l'indirizzo di memoria 0 ha un significato speciale; segnala che il puntatore non è destinato a puntare a una posizione di memoria accessibile. Ma per convenzione, se un puntatore contiene il valore null (zero), si presume che punti a nulla.

Per verificare la presenza di un puntatore nullo, puoi utilizzare un'istruzione if come segue:

if(ptr)     /* succeeds if p is not null */
if(!ptr)    /* succeeds if p is null */

Puntatori Objective-C in dettaglio

I puntatori hanno molti ma semplici concetti e sono molto importanti per la programmazione Objective-C. Di seguito sono riportati alcuni importanti concetti di puntamento, che dovrebbero essere chiari a un programmatore Objective-C:

Sr.No. Concetto e descrizione
1 Objective-C - Aritmetica del puntatore

Ci sono quattro operatori aritmetici che possono essere usati sui puntatori: ++, -, +, -

2 Objective-C - Array di puntatori

È possibile definire array per contenere un numero di puntatori.

3 Objective-C - Puntatore al puntatore

Objective-C ti consente di avere un puntatore su un puntatore e così via.

4 Passaggio di puntatori a funzioni in Objective-C

Il passaggio di un argomento per riferimento o per indirizzo consente entrambi di modificare l'argomento passato nella funzione chiamante dalla funzione chiamata.

5 Restituisce il puntatore dalle funzioni in Objective-C

Objective-C consente a una funzione di restituire un puntatore a una variabile locale, una variabile statica e anche una memoria allocata dinamicamente.