C/Vettori e puntatori/Puntatori: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Riga 140:
Per una maggiore comprensione di questo paragrafo, e per una descrizione dei puntatori a funzione, si consiglia la lettura della [[C/Vettori_e_puntatori/Puntatori|sezione dedicata ai puntatori]].
 
=={{IndexItem|array, passaggio ad una funzione}}Passare un array ad una {{IndexItem|funzione}}funzione==
===Primo metodo===
Il nome di un array, generalmente, '''decade''' in un {{IndexItem|puntatore}}puntatore al suo primo elemento. Questo avviene sempre, tranne quando si usa il nome dell'array come argomento di sizeof, quando si usa l'operatore & ("indirizzo di"), o durante un'inizializzazione con una stringa letterale.
Tale puntatore può essere passato ad una funzione. In questo modo si può passare un intero array alla funzione.
 
Per esempio:
 
<source lang="c">
void doubleof(int *ilmioarray);
int main(void)
{
int i, arr[5]={1,2,3,4,5};
doubleof(arr);
for (i=0; i<5; i++)
printf("arr[%d] = %d.\n", i, arr[i]);
return 0;
}
void doubleof(int *ilmioarray)
{
int j;
for(j=0; j<5; j++)
ilmioarray[j] = ilmioarray[j]*2;
}
</source>
 
restituisce:
 
<pre>
arr[0] = 2.
arr[1] = 4.
arr[2] = 6.
arr[3] = 8.
arr[4] = 10.
</pre>
 
===Secondo metodo===
In questo metodo cambia solo la sintassi della funzione, ma il meccanismo è identico. Il vantaggio di questo meccanismo è che rende palese il fatto che ad una funzione verrà passato un array, ma se alla funzione fosse passato un puntatore non produrrebbe errori in fase di compilazione, ma si potrebbe comportare in modo insolito.
 
<source lang="c">
void doubleof(int ilmioarray[]);
int main(void)
{
int i, arr[5]={1,2,3,4,5};
doubleof(arr);
for (i=0; i<5; i++)
printf("arr[%d] = %d.\n", i, arr[i]);
return 0;
}
void doubleof(int ilmioarray[])
{
int j;
 
for(j=0; j<5; j++)
ilmioarray[j]=ilmioarray[j]*2;
}
</source>
=={{IndexItem|funzioni, puntatori a}}{{IndexItem|puntatori a funzioni}}Puntatori a funzioni==
È possibile far puntare un puntatore ad una funzione, in modo che essa possa essere chiamata attraverso il puntatore. Anche le funzioni, come le variabili, hanno un indirizzo di memoria.