C++ i puntatori

Yerka

Il C e C++ molto i puntatori. Perche'?

  • e' l'unico modo per esprimere alcune operazioni;
  • produce codici sorgenti compatti ed efficienti;
  • rappresenta uno strumento molto efficace.

Il C utilizza molto i puntatori in maniera esplicita con:

  • vettori;
  • strutture;
  • funzioni.

Un puntatore e' un tipo di dato, una variabile che contiene l'indirizzo
in memoria di un'altra variabile. Si possono avere puntatori a qualsiasi tipo
di variabile.
La dichiarazione di un puntatore include il tipo dell'oggetto a cui il
puntatore punta.
In C ogni variabile ha due tipi di valori: una locazione e un valore
contenuto in quella locazione.

L' operatore & (operatore unario, o monadico) fornisce l'indirizzo di una
variabile.
L' operatore * (operatore indiretto, o non referenziato) da' il contenuto
dell'oggetto a cui punta un puntatore.

Per dichiarare un puntatore ad una variabile, l'istruzione e':

int *pointer;

Nota: e' obbligatorio associare un puntatore ad un tipo particolare; per
esempio, non e' possibile assegnare l'indirizzo di uno short int ad un
long int.

Consideriamo gli effetti del seguente codice:

int *pointer;  /* dichiara pointer come un puntatore a int */
int x=1,y=2;

(1) pointer= &x;   /* assegna a pointer l'indirizzo di x */
(2) y=*pointer;    /* assegna a y il contenuto di pointer */
(3)   x=pointer      /* assegna ad x l'indirizzo contenuto in pointer */
(4) *pointer=3;    /* assegna al contenuto di pointer il valore 3 */

Vale la pena considerare cosa succede al "livello macchina" in memoria per
capire completamente come funzionano i puntatori.
Supponiamo che la variabile x si trovi nella locazione di memoria 100, y nella
200 e pointer nella 1000 (ricordiamo che pointer e' una variabile a tutti gli
effetti, e cosi' il suo valore necessita di essere memorizzato da qualche
parte; e' la caratteristica del valore dei puntatori che risulta nuova).

L'istruzione (1) fa si che pointer punti alla locazione di memoria 100
(quella di x).
La (2) fa si che y assuma valore 1 (il valore di x).
La (3) fa si che x assuma valore 100 (cioe' il valore di pointer).
La (4) fa si che il valore del contenuto di pointer sia 3 (quindi x=3).

Notate che le assegnazioni x=1 e y=2 ovviamente caricano questi valori nelle
variabili; pointer e' dichiarato come puntatore ad un intero e vi e'
assegnato l'indirizzo di x (&x), cosi' pointer verra' caricato con il valore
100.

Ecco un primo esempio di suo utilizzo:

@include<iostream>

using namespace std;
int main()
{
int *i;
int x;
x=10;
i=&x;
cout<<"valore della memoria "<<i<<endl;
cout<<"valore di x "<<x<<endl;
// il valore a cui punta il puntatore
cout<<"valore a cui punta il puntatore "<<*i<<endl;
// cambio il valore di x tramite il suo puntatore
*i=23;
cout<<"nuovo valore di x "<<x<<endl;
// vettore e puntatore
int v[3];
int *pv;
//lettura de vettore
for (int k=0;k<3;k++)
{
cout<<"Inserisci elemento "<<k<<" del vettore"<<endl;
cin>>v[k];
}
//stampa del vettore
cout<<"ecco il vettore "<<endl;
for (int k=0;k<3;k++)
{
cout<<v[k]<<endl;
}
pv = v;
cout<<"stamap indirizzi di memoria del vettore"<<endl;
for(int k=0;k<3;k++)
{
cout<<pv+k<<endl;
}
return 0;
}

 

Info su Francesco Bragadin

Insegno informatica e telecomunicazioni al liceo scienze applicate ed all'indirizzo informatica e telecomunicazioni. Ho terminato gli studi in ingegneria elettronica e telecomunicazioni lavorando per molti anni come libero professionista nell'ambito della gestione storage e disaster recovery su mainframe.
Questa voce è stata pubblicata in Senza categoria. Contrassegna il permalink.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *