Learning GNU C: i puntatori | OTHER chapters | |||
Ci sono due nuovi operatori che dovete conoscere per lavorare con i puntatori. L'operatore "indirizzo di":
e l'operatore di dereferenziazione:
Entrambi sono operatori di prefisso unari. Quando mettete una e commerciale prima di una variabile:
ne ricevete l'indirizzo di memoria, che potrà essere memorizzato in un puntatore. Quando mettete un asterisco prima di un puntatore:
ne ricevete il valore memorizzato all'indirizzo di memoria al quale il puntatore punta. Vediamo un esempio, per verificare quanto tutto questo sia semplice:
L'output di questo programma stampa a video l'indirizzo delle due variabili. L'indirizzo assegnato dal vostro sistema alle due variabili, ovviamente, sarà diverso dal mio. Nella funzione
Perfetto. Non è così complicato. Una volta che avrete preso confidenza con i puntatori, sarete sulla buona strada per padroneggiare C. Quando il vostro programma è in esecuzione ed incontra una dichiarazione di variabile, il vostro programma richiede al sistema operativo qualche byte di memoria. Il sistema operativo trova un'area libera di memoria, grande abbastanza, e ne comunica al vostro programma l'indirizzo. Ogni volta in cui il vostro programma vorrà leggere il valore conservato dalla variabile, cercherà il suo indirizzo di memoria e leggerà, a partire da quel byte, un numero di byte pari alle dimensioni del tipo di dati al quale la variabile appartiene. Se eseguite il programma del nostro ultimo esempio una seconda volta, potreste avere un risultato diverso, come indirizzi di memoria. Questo dipende dal vostro sistema operativo, ma anche se riceveste sempre gli stessi indirizzi, per un certo numero di esecuzioni, non esiste alcuna garanzia che riceviate gli stessi risultati la prossima volta. Anzi, questo è molto improbabile.
Uno degli aspetti più utili dei puntatori è che essi permettono ad una funzione di modificare le variabili, anche se esterne alla portata ( scope ) della funzione stessa. Passando un puntatore ad una funzione, infatti, fate in modo che quella funzione possa leggere e sovrascrivere il dato ( o i dati ) memorizzato nella variabile. Supponiamo che vogliate scrivere una funzione che scambi i valori tra due variabili. Senza i puntatori, questo sarebbe praticamente impossibile. Ecco come fare con i puntatori:
Come potete vedere, abbiamo una dichiarazione di funzione, per la funzione In questo paragrafo, l'autore dimentica di spiegare perchè lo stesso risultato non potrebbe essere raggiunto senza l'ausilio dei puntatori. Il motivo è da ricercare in quella che viene definita: la portata ( scope ) di una variabile. Le variabili dichiarate all'interno di una funzione, hanno validità solo all'interno di quella funzione. Proviamo a scrivere lo stesso programma, escludendo l'uso dei puntatori:
In questo caso, lo scambio dei due valori avverrebbe solo all'interno della funzione E' possibile eseguire operazioni matematiche sui puntatori, come su una qualsiasi altra variabile. Questo, però, può avere una utilità solo in un numero ristretto di casi. Dividere, per una qualche ragione, un puntatore per due potrebbe significare lasciare che il puntatore, poi, punti ad un'area di memoria che non appartiene al vostro programma. Se il vostro programma tentasse di leggere o scrivere da una simile area di memoria, il vostro programma verrebbe chiuso, dal sistema operativo, con un messaggio di "segmentation fault" ( errore di segmentazione ). Si ha un "segmentation fault" quando un programma tenta di accedere ad un segmento della memoria per il quale non detiene il permesso all'accesso. Tuttavia, ci sono casi in cui è possibile operare sui puntatori per semplici addizioni. Lo vedremo nel prossimo capitolo, quando parleremo degli array ( variabili multiple, memorizzate in indirizzi di memoria attigui ). Nel caso di addizioni ( e di sottrazioni ), le operazioni matematiche vengono eseguite su unità uguali alle dimensioni del tipo di dati correlato al puntatore. Quando una variabile viene dichiarata come puntatore di tipo
|
||||
Learning GNU C: i puntatori | Disclaimer: this link points to content provided by other sites. |