Passare una variabile ad una funzione per valore significa fare in modo che la funzione operi con una variabile diversa che contiene lo stesso valore di quella passata. Esempio:
codice:
int main() {
   int a = 10;
   chiamaFunzione(a);   // Passo la variabile 'a' per valore
   cout << a << endl;
   return 0;
}

void chiamaFunzione(int var) {
   var++;   // La funzione lavora con la variabile 'var'
            // che contiene una copia del valore di 'a'
}
Qualsiasi modifica tu faccia alla variabile var non avrà alcun effetto sulla variabile 'a', poiché essa rappresenta solo una copia.

Passando, invece, per indirizzo non viene effettuata alcuna copia del valore, ma la variabile della funzione punterà alla variabile passata, utilizzando, effettivamente, quella variabile per l'elaborazione. Esempio:
codice:
int main() {
   int a = 10;
   chiamaFunzione( &a );   // passo la variabile per indirizzo
   cout << a << endl;
   return 0;
}

void chiamaFunzione(int *var) {
   (*var)++;   // Ora modifico la variabile 'a'
}
Il primo esempio stampa il valore 10, perchè la variabile non viene cambiata di valore (solo la copia viene cambiata, ma poi viene persa quando la funzione ritorna).

Il secondo esempio, invece, stampa il valore 11 perché la funzione, effettivamente, modifica il valore della variabile che le viene passata.

Ovviamente, se la variabile che viene passata alla funzione non deve essere modificata, ma serve alla funzione solo per la sua elaborazione, passarla per valore o per indirizzo non cambia assolutamente niente. Le implicazioni dell'utilizzo dell'uno o dell'altro metodo, in quest'ultimo caso, si vedrebbero solamente quando si fa uso di programmazione concorrente, utilizzando i thread.


Ciao.