Una variabile è l'astrazione di una zona di memoria.
Quando noi dichiariamo una variabile in base al tipo viene occupata una zona di memoria di un tot di Byte.
I parametri che sono le variabili che noi passiamo al sottoprogramma, possono essere passati per indirizzo o per valore.
Se viene passata per valore, una variabile viene duplicata in un'altra zona di memoria.
Se ad esempio dichiariamo la variabile "char carattere" viene occupato uno spazio disponibile in memoria, che in questo caso è di 1 Byte (ad esempio all'indirizzo 0x003F).
Se passiamo questa variabile al sottoprogramma per
valore viene occupata un'altra zona di memoria da un Byte(ad esempio all'indirizzo 0x0043) in cui si copierà il valore della variabile "carattere".
SITUAZIONE MEMORIA
0x0038 a
0x003F c <- Variabile relativa al programma chiamante
0x0041 1
0x0042 3
0x0043 c <- Variabile relativa al programma chiamato
0x0044 f
Il sottoprogramma lavorerà solamente sulla zona 0x0043 e quindi anche se il valore venisse modificato durante l'esecuzione, al termine del sottoprogramma la zona di memoria dove risiede il valore della variabile duplicata "carattere" relativa solo al programma chiamato(0x0043) viene liberata e quindi il valore viene "perso" ed è come se la variabile del programma chiamante non fosse stata modificata (come in effetti lo è
ed avrà lo stesso valore di quando ha chiamato il sottoprogramma. Se invece al sottoprogramma viene passata una variabile per
indirizzo, verrà preso come riferimento la stessa zona di memoria in cui risiede la variabile del programma chiamante.
SITUAZIONE MEMORIA
0x0038 a
0x003F c <-Variabile relativa al programma chiamante e al programma chiamato
0x0041 1
0x0042 3
0x0043 9
0x0044 f
Quindi se il valore all'interno del sottoprogramma dovesse essere modificato, la modifica si ripercuoterà anche sulla variabile del programma chiamante.
Ecco la differenza tra passaggio per indirizzo e per valore.
Ricapitolando:
Passiamo una variabile per valore solo se vogliamo che il sottoprogramma chiamato non modifichi il contenuto della variabile del programma chiamante ma vogliamo che utilizzi solo il suo valore.
Passiamo una variabile per indirizzo solo se volgiamo che il sottoprogramma chiamato modifichi intenzionalmente il valore della variabile del sottoprogramma chiamante.
Una variabile globale è riconosciuta da tutti i sottoprogrammi.
Una variabile locale è riconosciuta solo dal sottoprogramma in cui è dichiarata.
P.S.: Voglio precisare che in C esiste solo la definizione di funzione, perché la procedura è vista come caso particolare, perché restituisce comunque un valore che però è nullo (ovvero il void).