C - Puntatori

I puntatori in C sono facili e divertenti da imparare. Alcune attività di programmazione in 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 C. Cominciamo ad apprenderli in passaggi semplici e facili.

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

#include <stdio.h>

int main () {

   int  var1;
   char var2[10];

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

   return 0;
}

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

Address of var1 variable: bff5a400
Address of var2 variable: bff5a3f6

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 utilizzarlo per memorizzare qualsiasi indirizzo di variabile. La forma generale di una dichiarazione di variabile puntatore è:

type *var-name;

Qui, typeè il tipo di base del puntatore; deve essere un tipo di dati C valido evar-nameè il nome della variabile del puntatore. L'asterisco * utilizzato per dichiarare un puntatore è lo stesso asterisco utilizzato per la moltiplicazione. Tuttavia, in questa istruzione l'asterisco viene utilizzato per designare una variabile come puntatore. Dai un'occhiata ad alcune delle 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 alcune 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. Il seguente esempio fa uso di queste operazioni:

#include <stdio.h>

int main () {

   int  var = 20;   /* actual variable declaration */
   int  *ip;        /* pointer variable declaration */

   ip = &var;  /* store address of var in pointer variable*/

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

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

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

   return 0;
}

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

Address of var variable: bffd8b3c
Address stored in ip variable: bffd8b3c
Value of *ip variable: 20

Puntatori NULL

È sempre buona norma assegnare un valore NULL a una variabile puntatore nel caso in cui non si abbia un 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:

#include <stdio.h>

int main () {

   int  *ptr = NULL;

   printf("The value of ptr is : %x\n", ptr  );
 
   return 0;
}

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

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 in dettaglio

I puntatori hanno molti ma semplici concetti e sono molto importanti per la programmazione C. I seguenti importanti concetti relativi ai puntatori dovrebbero essere chiari a qualsiasi programmatore C:

Sr.No. Concetto e descrizione
1 Puntatore aritmetico

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

2 Matrice di puntatori

È possibile definire array per contenere un numero di puntatori.

3 Puntatore al puntatore

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

4 Passaggio di puntatori a funzioni in C

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

5 Restituisce il puntatore dalle funzioni in C

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