Programmazione.html.it

  Home page

   Guida Base

   Guida al Java

   Guida al C

   Guida al C++

   Guida al Delphi

   Guida a VB .NET

   Guida al Visual Basic

   Guida al Python

   Guida al'UML

  Forum di discussione
  HTML.it


Guida al linguaggio C
  LEZIONE:  I Puntatori


I puntatori sono la parte più importante della programmazione in C, quella che permette di lavorare "a basso livello" (cioè agendo su singole istruzioni del processore), mantenendo però una praticità unica nel suo genere.

Cosa è un puntatore? Un puntatore è una variabile che contiene l'indirizzo di memoria di un'altra variabile. Quando dichiariamo una variabile, a questa verrà riservato un indirizzo di memoria, ad esempio la posizione 1000; un puntatore contiene, appunto, l'indirizzo di tale variabile (quindi il valore 1000). L'importanza risiede nel fatto che si possono manipolare sia il puntatore che la variabile puntata (cioè la variabile memorizzata a quell'indirizzo di memoria).

Per definire un puntatore è necessario seguire la seguente sintassi:

// variabile normale
int variabile;

// puntatore
int *puntatore;

L'asterisco (*) viene chiamato operatore di indirezione o deferenziazione e restituisce il contenuto dell'oggetto puntato dal puntatore; mentre l'operatore & restituisce l'indirizzo della variabile e va usato nella seguente forma:

// assegno al puntatore l'indirizzo di variabile
puntatore = &variabile;

Per fare un esempio pratico, assumiamo di avere due variabili, alfa e beta ed un puntatore di nome pointer; assumiamo anche che alfa risieda alla locazione di memoria "100", beta alla locazione "200" e pointer alla locazione "1000" e vediamo, eseguendo il codice sotto proposto, il risultato ottenuto:

#include <stdio.h>

int main()
{
   int alfa = 4;
   int beta = 7;
   int *pointer;

   pointer = &alfa;
   printf("alfa -> %d, beta -> %d, pointer -> %d\n", alfa, beta, pointer);
   beta = *pointer;
   printf("alfa -> %d, beta -> %d, pointer -> %d\n", alfa, beta, pointer);
   alfa = pointer;
   printf("alfa -> %d, beta -> %d, pointer -> %d\n", alfa, beta, pointer);
   *pointer = 5;
   printf("alfa -> %d, beta -> %d, pointer -> %d\n", alfa, beta, pointer);
}

Questo stamperà a video i valori corretti di alfa e beta (4 e 7) e l'indirizzo di alfa memorizzato nel puntatore (100):

alfa -> 4, beta -> 7, pointer -> 100

poi assegniamo a beta il valore dell'oggetto puntato da pointer (alfa), e quindi il valore 4:

alfa -> 4, beta -> 4, pointer -> 100

successivamente assegniamo ad alfa il valore memorizzato in pointer e quindi l'indirizzo di memoria di alfa stesso,

alfa -> 100, beta -> 4, pointer -> 100

continuiamo memorizzando in alfa (l'oggetto puntato da pointer) il valore 5,

alfa -> 5, beta -> 4, pointer -> 100

Esiste anche un aritmetica base dei puntatori ai quali è possibile aggiungere o togliere dei valori, che generalmente vengono rappresentati come blocchi di memoria; per intendersi, un puntatore esiste sempre in funzione del tipo di oggetto puntato, se creo un puntatore ad int, il blocco di memoria vale 4 byte, un puntatore a char, invece, usa blocchi di 1 byte. In questo modo se utilizzo l'operatore ++, incremento del blocco a seconda del tipo di variabile puntata.

Come mostreremo di seguito i puntatori possono essere usati con successo in combinazione con funzioni, array e strutture.



Torna a inizio pagina