/**
 * Un autre exemple du troisième cours portant sur la transmission de
 * références.
 */
public class Ex32 {
  /*
   * Cette fonction échange des données, mais non pas des données qui
   * auraient été passées en paramètre, puisque ce n'est pas possible,
   * elle échange des données qui sont «ailleurs» mais accessible via
   * le paramètre passé. Quand on appelle cette fonction, on lui
   * transmet la valeur d'une référence, qui sert à l'initialisation
   * de la référence t, laquelle désigne alors une zone de stockage
   * existante par ailleurs (probablement dans le tas). On ne
   * transmet pas cette zone, on transmet simplement son adresse...
   * La modification effectuée dans cette zone est donc observable
   * au retour de l'appel!
   */
  public static void echange(int []t) {
    int tmp = t[0];
    t[0] = t[1];
    t[1] = tmp;
  }
  /*
   * Ceci est une fonction qui reçoit en paramètre une valeur du  type
   * référence vers tableau d'entiers, cette valeur sera stockée dans
   * le paramètre (la variable locale) de nom t.
   */
  public static void f(int []t) {
    System.out.println(t+" "+t[0]);
    // t désigne maintenant un nouveau tableau
    t = new int[2];
    // on modifie ce nouveau tableau
    t[0] = 111;
    // on fait joujou avec ce tableau (voir la fonction echange)
    echange(t);
    System.out.println(t+" "+t[0]);
    // quand on sort t est oubliée (détruite), le tableau se retrouve
    // orphelin de référence (il n'y a plus de référence le désignant)
    // et est donc recyclé...
  }
  public static void main(String []args) {
    int []tab;
    tab = new int[5];
    System.out.println(tab+" "+tab[0]);
    f(tab);
    System.out.println(tab+" "+tab[0]);
    
    tab[0] = 111;
    tab[1] = 222;
    System.out.println(tab+" "+tab[0]+" "+tab[1]);
    echange(tab);
    System.out.println(tab+" "+tab[0]+" "+tab[1]);
    echange(tab);
    System.out.println(tab+" "+tab[0]+" "+tab[1]);
  }
}