/* formules magiques C++ pour que tout aille bien au départ */
#include <iostream>
using namespace std;

/* ici on emploie une technique propre au C++ en utilisant des paramètres
   qui sont des références/des alias/des surnoms des variables transmises */
void echange(int &a,int &b) {
  int t;
  t = a;
  a = b;
  b = t;
}

int main() {
  /* rien de particulier ici, une variable sur la pile qui contient 15
     et que l'on affiche (avec l'incantation magique adéquate du C++)
  */
  int i;
  i = 15;
  cout << i << endl;

  /* ici une certaine magie opère, car la variable j n'en est pas une...
     Il s'agit en fait d'une référence (à ne pas confondre avec les références
     de Java), c'est-à-dire d'un nom/symbole (comme i) qui désigne la même
     zone mémoire que la variable i... En fait i et j sont deux symboles qui
     désignent la m^me zone mémoire!
  */
  int &j = i;
  cout << j << endl;

  /* essayons de modifier i. Et observons l'effet via les deux symboles...
   */
  i = 666;
  cout << i << endl;
  cout << j << endl;

  int a = 111;
  int b = 222;
  cout << "avant echange a=" << a << " et b=" << b << endl;
  echange(a,b);
  cout << "apres echange a=" << a << " et b=" << b << endl;
  /* ATTENTION, si l'on avait employé la même fonction echangerate qu'en C
     nous aurions obtenu le même résultat...
     En C++, nous pouvons passer des arguments à une fonction de deux façon
     différentes : par valeur/copie ou par référence.
  */
}