Costanti e puntatori

Sappiamo che la parola chiave const serve a far sì che il valore contenuto in una variabile non possa essere modificato:

const int var1 = 93;

var1 = 418; //ERRATO! NON POSSIAMO MODIFICARE UNA COSTANTE!

Nel caso di un puntatore, abbiamo due utilizzi differenti della parola chiave const.

Un caso è quello in cui vogliamo che l'area di memoria puntata dal puntatore non possa essere modificata:

int var2 = 23;

const int* punt1 = &var2;

*punt1 = 56; //ERRATO!

Il codice appena visto è errato perché il puntatore è un puntatore a costante, e quindi non possiamo utilizzare il puntatore per modificare l'area di memoria puntata.

L'altro caso è quello in cui vogliamo che l'indirizzo a cui punta il puntatore sia costante, e cioé che il puntatore punti sempre allo stesso indirizzo e questo non possa essere modificato:

int* const punt2 = &var3; //assegniamo al puntatore l'indirizzo di var3

punt2 = &var4; //ERRATO!

Il codice è errato perché punt2 è un puntatore const, e cioé una volta assegnatogli l'indirizzo di var3, non potremo mai fargli puntare ad un altro indirizzo.

Come è chiaro si tratta di due funzionalità diverse, tuttavia le due dichiarazioni sono simili.
La chiave, a mio parere, sta nell'appiccicare l'asterisco al tipo.

Credo che in questo modo sia di più facile lettura:

const int* punt1

la riga precedente, dove è il dato puntato ad essere costante, può essere letta così, da destra verso sinistra:

"crea un puntatore ad un dato di tipo int, il quale dato sarà costante"

Mentre la riga seguente, dove è il puntatore a puntare ad un indirizzo costante:

int* const punt2

può essere letto come:

"crea un puntatore ad indirizzo costante, il quale indirizzò si riferisce ad un dato di int"

In altre parole l'operatore * va sempre appiccicato alla destra del tipo, mentre a variare il significato della dichiarazione è la posizione della parola const: se precede il nome del puntatore, significa che sarà l'indirizzo ad essere costante; mentre se precede il tipo significa che sarà il dato puntato ad essere costante.

Nel caso un puntatore debba puntare sia ad un dato costante che ad un indirizzo costante, basta fare così:

const int* const punt1;

In questo modo il puntatore pun1 punta ad un'area di memoria costante, la quale sarà anch'essa costante.

E' fondamentale sapere che, se si vuole puntare ad una variabile const, è obbligatorio dichiarare come const anche il dato puntato dal puntatore:

const int var1;

int* punt1 = &var1; //ERRATO! var1 E' const

const int* punt2 = &var1; //CORRETTO! ANCHE IL PUNTATORE PUNTA A const

Nessun commento:

Posta un commento