INTRODUZIONE ALLA PROGRAMMAZIONE IN C



Puntatori e funzioni



Esamineremo ora la stretta relazione tra i puntatori e le altre parti principali del C, incominciando con le funzioni. Il C passa argomenti alle funzioni per valore. Ci sono molti casi in cui possiamo avere la necessita' di variare un argomento passato in una funzione e ricevere di ritorno il nuovo valore una volta che la funzione e' terminata. Gli altri linguaggi sono in grado di fare questa operazione internamente (come ad esempio i parametri "var" in PASCAL), mentre il C utilizza esplicitamente i puntatori per farlo. Il miglior metodo per comprenderne il funzionamento e' quello di fare un esempio in cui dobbiamo essere in grado di ricevere parametri cambiati. Proviamo ad esempio a trovare un modo per effettuare uno scambio di variabili (swap). La consueta chiamata di funzione: swap(a, b) non funziona. I puntatori forniscono quindi la possibile soluzione: passare l'indirizzo delle variabili alla funzione ed accedere all'indirizzo della funzione stessa. Cosi' la chiamata di funzione nel nostro programma potra' apparire come segue: swap(&a, &b) Il codice sorgente della funzione swap e' abbastanza lineare: void swap(int *px, int *py) { int temp; temp=*px; /* contenuto di pointer */ *px=*py; *py=temp; } main() { int a=10,b=20; ... swap(&a,&b); ... } Possiamo ritornare un puntatore dalle funzioni. Un esempio frequente e' quello di ritornare strutture: typedef struct {float x,y,z;} COORD; main() {COORD p1, *coord_fn();/* dichiara fn come return pointer di tipo COORD */ ... p1=*coord_fn(...); /* assegna il contenuto dell'indirizzo restituito */ ... } COORD *coord_fn(...) {COORD p; ... p=...; /* assegna un valore alla struttura */ return &p; /* ritorna l'indirizzo di p */ } In questo esempio ritorniamo un puntatore il cui contenuto e' immediatamente tradotto in una variabile. Dobbiamo pero' farlo contestualmente all'uscita del valore dalla funzione, poiche' la variabile a cui puntiamo e' locale alla funzione stessa che e' appena terminata. Questo significa che lo spazio dell'indirizzo si rende subito libero e puo' essere sovrascritto.