Programmare in C – Usare i puntatori come parametri di funzioni

La maggior parte dei programmatori C inizia ad usare i puntatori per implementare quello che viene chiamato il passaggio di parametri nelle funzioni.

Abbiamo già visto come si passano i parametri alle funzioni, ad esempio con la funzione scanf, in cui si deve usare il simbolo & (l'operatore indirizzo). Ora che abbiamo spiegato in dettaglio il significato dei puntatori, possiamo riprendere in mano la funzione scanf e capire davvero come funziona.

Per capire come funziona il passaggio dei parametri in una funzione, implementiamo una funzione swap (scambio) in C. In altre parole, stiamo per creare una funzione che accetta in input due parametri e ne restituisce il valore scambiandoli. Questo codice che segue è il primo tentativo di mettere a punto tale funzione swap

#include <stdio.h>

void swap(int i, int j)
{
    int t;

    t=i;
    i=j;
    j=t;
}

void main()
{
    int a,b;

    a=5;
    b=10;
    printf("%d %d\n", a, b);
    swap(a,b);
    printf("%d %d\n", a, b);
}

Quando si esegue questo programma, si scopre che... nessuno scambio viene effettuato. I valori di a e b vengono passati alla funzione swap, la funzione li scambia ma quando la funzione termina scopriamo che i valori di a e b sono gli stessi di prima.

Per fare in modo che i valori di a e b risultino effettivamente scambiati nel programma principale, dobbiamo usare i puntatori in questo modo:

#include <stdio.h>

void swap(int *i, int *j)
{
    int t;
    t = *i;
    *i = *j;
    *j = t;
}

void main()
{
    int a,b;
    a=5;
    b=10;
    printf("%d %d\n",a,b);
    swap(&a,&b);
    printf("%d %d\n",a,b);
}

Per avere un'idea di cosa fa questo codice, vi consigliamo di stamparne una copia, disegnare i due interi a e b, scrivere al loro interno 5 in a e 10 in b. Disegnate poi i due puntatori i e j assieme all'intero t. Quando la funzione swap viene chiamata, ad essa vengono “passati gli indirizzi” di a e di b. Quindi, i punta ad a (e disegnate una freccia che da i va ad a) e j punta a b (disegnate una freccia fra b e j). Una volta che i puntatori sono inizializzati dalla chiamata alla funzione, *i è un altro nome di a e *j è l'altro nome di b. Ora eseguite il codice contenuto nella funzione swap. Quando il codice usa *i e *j significa che sta usando a e b e pertanto troveremo che la funzione swap scambia il valore di a con il valore di b e viceversa, ottenendo appunto l'effetto desiderato.

Supponiamo poi che voi dimentichiate accidentalmente il simbolo & durante la chiamata alla funzione swap, e quindi la linea di codice che effettua la chiamata sia:

swap(a,b);

Questo provoca un errore di segmentation fault. Quando si dimentica il simbolo &, il valore di a viene passato alla funzione, invece di passare il suo indirizzo. Pertanto, i punta ad una locazione di memoria non valida e il sistema va in crash non appena *i viene utilizzato.

Ecco spiegato il motivo per cui anche la funzione scanf va in crash quando si dimentica il simbolo &.

Il passaggio di parametri nelle funzioni (in modo che il valore di questi parametri risulti modificato dopo la chiamata ad una funzione) è uno degli usi principali dei puntatori in C. Ed ora potete capirne a pieno il funzionamento.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend