Si adesso ti posto degli esempi.
Esempio con passaggio di parametri per valore o copia:
// esempio di funzione
#include <iostream>
using namespace std;
int somma (int a, int b)
{
  int r;
  r=a+b;
  return r; //NOTARE la presenza del return 
}
int main ()
{
  int z;
  z = somma (5,3);
  cout << "Il risultato e' " << z;
  return 0;
}
Esempio con passaggio di parametri per riferimento o variabile:
// passaggio di parametri per riferimento
#include <iostream>
using namespace std;
void raddoppia (int &a, int &b, int &c)
{
  a=a*2;
  b=b*2;  //non presenza del return
  c=c*2;
}
int main ()
{
  int x=1, y=3, z=7;
  raddoppia (x, y, z);
  cout << "x=" << x << ", y=" << y << ", z=" << z;
  return 0;
}
Il mio dubbio è:
in molti esempi ho notato che nelle definizioni delle funzioni chiamate quando vi è il passaggio di parametri per valore dalla funzione chiamante a quella chiamata , vi è il return del valore.
Invece quando vi è un passaggio di parametri per riferimento nella definizione delle funzioni chiamate non vi è piu il return. 
L'unica spiegazione che mi sono fatto è che , mentre nel passaggio di parametri per valore vi è una preventiva copia quindi il return serve per restituire il valore mentre nel passaggio di parametro per riferimenti si agisce direttamente sulla variabile e nel caso modificarla quindi non vi è bisogno del return nella definizione della funzione chiamata.
Un altro dubbio: ma con il passaggio di parametri per riferimento, posso fare più operazioni/istruzioni all'interno del corpo della funzione chiamata?rispetto a un passaggio di parametri per valore?