Facciamo un esempio.
Devi scrivere una funzione che inserisca all'interno di una variabile un dato valore. Come fai per dare visibilità a quella variabile all'interno della funzione? La dichiari globale. NO! SBAGLIATO!
Le globali si usano il meno possibile!
La questione si risolve creando una variabile non globale a livello di funzione chiamante, e passandola per indirizzo alla funzione chiamata che ne manipolerà il contenuto. Al termine della funzione chiamata il programma tornerà alla funzione chiamante e il valore della nostra variabile sarà quello assegnato dalla funzione chiamata.
Se effettuassi invece il passaggio per valore, il contenuto della variabile al rientro dalla funzione chiamata risulterebbe lo stesso che si aveva prima della chiamata stessa a quella funzione.