31.05.2013 Views

Tricky C - Si® @lbert Site

Tricky C - Si® @lbert Site

Tricky C - Si® @lbert Site

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

18 - <strong>Tricky</strong> C<br />

primo puntatore e privare tutti gli altri dell'asterisco nella convinzione che il tipo dichiarato sia int*. In<br />

realtà, una riga di codice come quella appena riportata dichiara una serie di oggetti di tipo int; è la<br />

presenza o l'assenza dell'operatore di indirezione a stabilire, singolarmente per ciascuno di essi, se si tratti<br />

di una variabile o di un puntatore.<br />

Mediante l'operatore & (detto "indirizzo di", o address of) è possibile, inoltre, conoscere<br />

l'indirizzo di una variabile:<br />

float numero; // dichiara una variabile float<br />

float *numPtr; // dichiara un puntatore ad una variabile float<br />

numero = 12.5; // assegna un valore alla variabile<br />

numPtr = &numero; // assegna al puntatore l'indirizzo della variabile<br />

E' chiaro il rapporto tra puntatori e variabili? Una variabile contiene un valore del tipo della<br />

dichiarazione, mentre un puntatore contiene l'indirizzo, cioè la posizione in memoria, di una variabile che<br />

a sua volta contiene un dato del tipo della dichiarazione. Dopo le operazioni dell'esempio appena visto,<br />

numPtr non contiene 12.5, ma l'indirizzo di memoria al quale 12.5 si trova.<br />

Anche un puntatore è una variabile, ma contiene un valore che non rappresenta un dato di un<br />

particolare tipo, bensì un indirizzo. Anche un puntatore ha il suo bravo indirizzo, ovviamente. Riferendosi<br />

ancora all'esempio precedente, l'indirizzo di numPtr può essere conosciuto con l'espressione &numPtr<br />

e risulta sicuramente diverso da quello di numero, cioè dal valore contenuto in numPtr. Sembra di<br />

giocare a rimpiattino...<br />

Proviamo a confrontare le due dichiarazioni dell'esempio:<br />

float numero;<br />

float *numPtr;<br />

Esse sono fortemente analoghe; del resto abbiamo appena detto che la dichiarazione di un<br />

puntatore è identica a quella di una comune variabile, ad eccezione dell'asterisco che precede il nome del<br />

puntatore stesso. Sappiamo inoltre che il nome attribuito alla variabile identifica un'area di memoria che<br />

contiene un valore del tipo dichiarato: ad esso si accede mediante il nome stesso della variabile, cioè il<br />

simbolo che, nella dichiarazione, si trova a destra della parola chiave che indica il tipo, come si vede<br />

chiaramente nell'esempio che segue.<br />

printf("%f\n",numero);<br />

L'accesso al valore della variabile avviene nella modalità appena descritta non solo in lettura,<br />

ma anche in scrittura:<br />

numero = 12.5;<br />

Cosa troviamo a destra dell'identificativo di tipo in una dichiarazione di puntatore? Il nome<br />

preceduto dall'asterisco. Ma allora anche il nome del puntatore con l'asterisco rappresenta un valore del<br />

tipo dichiarato... Provate ad immaginare cosa avviene se scriviamo:<br />

printf("%f\n",*numPtr);<br />

La risposta è: printf() stampa il valore di numero 22 . In altre parole, l'operatore di<br />

indirezione non solo differenzia la dichiarazione di un puntatore da quella di una variabile, ma consente<br />

anche di accedere al contenuto della variabile (o, più in generale, della locazione di memoria) indirizzata<br />

dal puntatore. Forse è opportuno, a questo punto, riassumere il tutto con qualche altro esempio.<br />

22 Presupposto fondamentale è l'assegnazione a numPtr dell'indirizzo di numero, come da esempio.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!