Si l'on reprend la logique présentée dans l'exercice précédent, on s'attend au comportement
suivant :
- Lors de l'appel
echange(T, i, j);, le contenu du tableau T est copié dans le tableau local L
et les valeurs 0 et 3 (de i et j) sont copiées dans les variables locales indice1, indice2.
- Un échange est fait entre les éléments d'indice 0 et d'indice 3 du tableau L.
- En sortant de la fonction, la variable locale L est oubliée et T est inchangé.
Or nous constatons que l'échange a bien eu lieu dans T.
Ceci est du au fait qu'un array n'est pas passé par valeur mais par référence.
Qu'est-ce que cela signifie ?
Cela signifie que lors de l'appel echange(T, i, j);, le contenu du tableau T n'est pas copié
dans un nouveau tableau L. En fait, c'est l'adresse en mémoire de T qui est copiée et L désigne donc le même
tableau que T (L et T ont la même adresse dans l'espace mémoire).
Toute modification faite sur L sera donc faite effectivement sur T.
Pour saisir ce qu'il se passe, on peut penser les variables comme des étiquettes sur des boîtes
contenant des valeurs.
- L'état avant l'appel de la fonction est le suivant :
- L'état juste après appel de la fonction est le suivant :

On voit sur ce schéma :
- Pour des variables de type number, de nouvelles boîtes sont créées lors de l'appel de la fonction (avec
de nouvelles étiquettes).
- Mais pour un array, la même boîte est utilisée et elle dispose d'une nouvelle étiquette provisoire.
Ainsi en sortant de la fonction, l'étiquette L n'existe plus, mais les modifications faites sont restées
car L désignait la même boîte que T.
Par contre, toute modification des boîtes étiquetées indice1 et indice2 n'aurait aucun effet sur les boîtes
étiquetées i et j.
Pourquoi les nombres sont-ils passés par valeur et les tableaux par référence?
Le passage par valeurs pour les nombres est en général plus pratique (la fonction peut mener des
calculs intermédiaires sans interférer sur les valeurs de la variable se trouvant en partie principale).
Pour les tableaux (et de façon plus générale pour les objets), un passage systématique par valeur poserait
un problème d'espace (imaginez que votre programme manipule un très grand tableau et que plusieurs fonctions
fassent appel à ce tableau: chaque appel faisant une copie du tableau, beaucoup d'espace mémoire serait
utilisé au risque d'un dépassement de la capacité mémoire). Un problème de temps est également en jeu: faire
une copie d'une longue liste n'est pas instantané et l'exécution d'un programme pourrait ainsi être
considérablement allongé.
Rappelons que l'on peut tout de même faire des copies de tableau (c'est à dire créer une variable tableau
dans laquelle on recopiera les valeurs d'un autre tableau, ces deux tableaux occupant des espaces mémoire distincts).
Cela permet de "simuler" un passage de tableau par valeurs si besoin.