prof. Nunzio Brugaletta | Programmazione e linguaggio C |
Nel linguaggio C tutti i parametri sono passati alle funzioni per valore e ciò allo scopo di isolare quanto più possibile la funzione e renderla riutilizzabile. Per passare alla funzione un parametro per riferimento è necessario ricorrere ai puntatori. L’unica eccezione a quanto detto riguarda gli array che sono sempre passati per indirizzo.
Per prendere confidenza con il passaggio di parametri ad una funzione e con la scelta di cosa passare per valore e cosa per riferimento, esaminiamo le chiamate di alcune funzioni comuni utilizzate fino ad ora:
scanf("%d",&a);
In questo caso sono passati alla funzione scanf due parametri: il valore di una stringa e l’indirizzo di una variabile. Il primo parametro è passato per valore, il secondo per riferimento. Lo scopo della funzione scanf è quello di acquisire valori dalla tastiera e depositarli in variabili di memoria. L’output della funzione è il valore assegnato alla variabile: la funzione ha necessità di conoscere che tipo di valore deve attendere (la stringa di formattazione è un suo input) e produce una variazione del valore attualmente contenuto in a (il valore contenuto in a è un suo output).
printf("Risultato %d",risult);
Lo scopo della funzione printf è quello di effettuare delle visualizzazioni su video: ha necessità di conoscere cosa visualizzare (i parametri sono passati per valore poiché costituiscono degli input per la funzione). La funzione non ha output: non produce risultati da utilizzare in altre funzioni, non c’è quindi passaggio di parametri per riferimento.
gets(frase);
Anche in questo caso, nonostante l’apparenza, c’è un parametro passato per riferimento. La gets è una funzione di input di stringhe e quindi frase sarà dichiarato come array di char. Nei vettori il nome è un puntatore: indica l’indirizzo del punto di inizio del vettore (praticamente la posizione dell’elemento di indice 0). Alla funzione gets è passato un riferimento al vettore frase.
A questo punto dovrebbe essere chiara una osservazione effettuata durante l’illustrazione della funzione di trattamento stringhe strcpy. La necessità di tale funzione è dovuta al fatto che, se per esempio s1 ed s2 sono due stringhe, l’assegnazione solita s1=s2, per il significato che assumono in C i nomi dei vettori, farebbe in modo che s1 diventi un nuovo riferimento all’unica stringa s2 (s1 ed s2 sarebbero due puntatori allo stesso vettore). La funzione strcpy(s1,s2) crea invece in s1 un duplicato di s2: ci saranno in questo caso due stringhe con lo stesso valore.
La funzione, nella sua definizione, preparerà variabili locali per poter ricevere i parametri passati dal chiamante. Nel caso di passaggio per indirizzo, per poterlo conservare, la funzione utilizzerà una variabile puntatore che è l’unica che può conservare un indirizzo. In questo ultimo caso, come specificato prima, ogni variazione effettuata dalla funzione sul contenuto della variabile locale si ripercuoterà sulla variabile corrispondente del chiamante.
I parametri passati dal chiamante vengono comunemente chiamati argomenti o parametri reali, mentre quelli presenti nella definizione della funzione vengono chiamati parametri formali.
http://ennebi.solira.org | ennebi@solira.org |