Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
I corsi di Ingegneria
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Valeria Vittorini » 2.Puntatori: Concetti Base


Tipi di Dato


Concetto di puntatore

Il tipo puntatore è introdotto da alcuni linguaggi di programmazione ad alto livello come forma di accesso al livello di astrazione della macchina sottostante.

Non tutti i linguaggi prevedono questa possibilità (ad esempio Fortran, Java).

Concetto di puntatore

Una variabile di tipo puntatore può assumere come valore unindirizzo di memoria. In figura la memoria è rappresentata come un vettore di locazioni contigue, ciascuna delle quali può essere riferita attraverso un indirizzo univoco. La locazione contenente la stringa di bit 0011 è l’area di memoria in cui è stata memorizzata una variabile Puntatore. Il suo contenuto 0011 quindi è un indirizzo di memoria che rimanda alla relativa locazione. Questa locazione di memoria, a sua volta, mantiene il dato di valore 1000001.


Il “tipo” puntatore in C/C++

Non esiste un unico tipo puntatore: più precisamente esiste un insieme di tipi puntatore a seconda del tipo dell’oggetto puntato. Ad esempio:

  • Tipo puntatore ad intero: l’oggetto puntato è una variabile di tipo intero;
  • Tipo puntatore a carattere: l’oggetto puntato è una variabile di tipo carattere;
  • Tipo puntatore a puntatore: l’oggetto puntato è una variabile di tipo puntatore;
  • Tipo puntatore a funzione: l’oggetto puntato è una funzione (precisamente è un’ istruzione…);
  • ….

Nella figura successiva il puntatore all’area di memoria 0011 sarà un puntatore al tipo del dato il cui valore è 100001. Per fissare le idee, se tale dato è di tipo intero la stringa di bit 1000001 sarà interpretata secondo la codifica dei numeri interi e avrà ad esempio valore 65, se invece il dato è di tipo carattere la stessa stringa verrà interpretata come carattere ad esempio il carattere A.

Puntatore a tipo di dato


Il “tipo” puntatore in C/C++

In altre parole non esiste il tipo puntatore in assoluto, ma sempre riferito ad un tipo.

Un puntatore non può contenere un indirizzo qualunque: esiste un vincolo di tipo.

La sintassi traduce tale vincolo consentendo di definire un puntatore ad un certo tipo T.

I puntatori

Il C/C++ prevede puntatori a funzione e puntatori a dati di qualsiasi natura, semplici o strutturati.

In particolare il puntatore viene utilizzato :

  • per il riferimento a variabili dinamiche;
  • per il riferimento a funzioni;
  • per gli array, in particolare per l’elaborazione di stringhe;
  • per i parametri formali di funzione, in alternativa allo scambio per riferimento;
  • per il riferimento a locazioni specifiche della memoria, associate a dispositivi hardware (ad esempio per l’ingresso-uscita).

Definizione di un puntatore in C/C++

T * p;

  • T è il tipo dell’oggetto puntato;
  • p è il nome della variabile di tipo puntatore a T;
  • A qualunque variabile di tipo puntatore e’ possibile associare il valore NULL o 0.

Esempi:

int * p=o; // ottima abitudine!
char * p;

L’operatore &

L’indirizzo della locazione di memoria di una variabile può essere ottenuto attraverso l’operatore unario & (operatore di referenza – “reference”,”address of”):

int x;
int * p;
p=&x;

l’indirizzo di x , &x, e’ assegnato alla variabile p. Si dice che “p punta a x”.

L’operatore *

L’operatore di de-referenza * (“content of”) esegue l’operazione inversa dell’operatore &: applicato ad una variabile di tipo puntatore restituisce il valore puntato

int v = *p;

in questa istruzione, e’ assegnato a v il contenuto della memoria a cui p punta (interpretato come numero intero).

Non confondere l’operatore di de-referenza con il costruttore di tipo (T *).

Esempio

Nell’esempio successivo vengono definite due variabili: una variabile di tipo intero ed una variabile intptr di tipo puntatore intero. La variabile i viene inizializzata al valore 10. La variabile puntatore intptr viene inizialmente inizializzata col valore 0 (in questo momento non punta quindi ad alcuna locazione di memoria) e poi assegnata all’indirizzo di memoria della variabile i, ottenuto applicando l’operatore & alla variabile i.

Le istruzioni successive mostrano l’effetto di tale assegnazione: è possibile visualizzare l’indirizzo di memoria della variabile i  visualizzando il valore del puntatore.

Mostra codice

I puntatori: operazioni

Il linguaggio C++ tratta esplicitamente le espressioni di tipo puntatore; in particolare sono previsti i seguenti operatori:

  • l’operatore di assegnazione tra puntatori che puntano allo stesso tipo T*;
  • gli operatori unari di incremento ++ e decremento — unitari (in forma prefissa e postfissa ++p, p++, –p, p–);
  • l’operatore di somma o differenza tra un puntatore ed un intero (p+i punta all’elemento che segue di i posizioni quello puntato da p).

I puntatori: operazioni

Definito un puntatore a tipo T

T * p;

il significato di un incremento (decremento) unitario è il seguente:

p=p+1 ⇒ p=p+sizeof(T);

dove sizeof(T) è un operatore che applicato al nome di un tipo restituisce il numero di byte necessario alla rappresentazione in memoria di una variabile di quel tipo.

Pertanto l’incremento è tale che p+1 punta all’area di memoria immediatamente successiva a quella impegnata dall’elemento puntato da p. Questa tecnica è particolarmente utile per i puntatori ad array.

Esempio

Nell’esempio seguente un vettore di interi viene inizializzato con valori inseriti da tastiera e attraverso un ciclo for vengono visualizzati gli indirizzi di memoria degli elementi del vettore (istruzione cout << (int)&v[i] << endl; ). Gli indirizzi degli elementi del vettore sono ottenuti  applicando ad ogni elemento l’operatore &. Si noti che  all’indirizzo  ritornato da & viene applicata una conversione di tipo, necessaria per ottenere la visualizzazione degli indirizzi in base dieci: in mancanza infatti gli indirizzi verrebbero visualizzati in base esadecimale.

Il programma prosegue mostrando l’utilizzo di un puntatore a tipo intero inizializzato all’indirizzo del primo elemento del vettore. Il puntatore viene usato per stampare il valore del primo elemento del vettore e il suo indirizzo in memoria, poi viene incrmentato di una unità: questo provoca lo spostamento del puntatore sul prossimo elemento del vettore, come mostrato dalle successive istruzioni di stampa.

Nella prossima slide viene mostrato un esempio di esecuzione.

Mostra codice

Esempio

inserisci 5 elementi di tipo intero:
1
2
3
4
5

sono stati memorizzati ai seguenti indirizzi:
2293592
2293596
2293600
2293604
2293608

valore dell’oggetto puntato da intptr: 1
valore contenuto in intptr: 2293592
valore dell’oggetto puntato da intptr: 2
valore contenuto in intptr: 2293596

Premere un tasto per continuare . . .

I materiali di supporto della lezione

C. Savy: Da C++ ad UML, McGraw-Hill; Cap. 8, par. 8.1, 8.2.1, 8.2.2, 8.2.3, 8.2.

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion