Nous avons jusqu'à présent utilisé les tableaux de manière intuitive,
en nous contentant de savoir qu'on peut déclarer un tableau par une
déclaration du genre :
int t[10];
et qu'on dispose d'un opérateur d'indexation noté [],
permettant d'obtenir un élément du tableau :
l'élément d'index i du tableau t se désigne par t[i].
Il est temps maintenant d'exposer une caractéristique originale des
références à un tableau dans le langage C : elles subissent une conversion
automatique.
Tout identificateur de type << tableau de X >> apparaissant dans
une expression est converti en une valeur constante dont :
-
le type est << pointeur vers X >> ;
-
la valeur est l'adresse du premier élément du tableau.
Cette conversion n'a lieu que pour un identificateur de type
<< tableau de X >> apparaissant dans une expression.
En particulier, elle n'a pas lieu lors de la déclaration.
Quand on déclare int T[10], le compilateur mémorise que T
est de type << tableau de 10 int >> et réserve de la place en mémoire pour
10 entiers.
C'est lors de toute utilisation ultérieure de l'identificateur T,
que cette occurrence de T sera convertie en type int *, de
valeur adresse de T[0].
La conversion automatique d'un identificateur ayant le type tableau
empêche de désigner un tableau en entier, c'est pour cette
raison que l'opérateur d'affectation ne peut affecter un tableau à un autre
tableau :
int t1[10];
int t2[10];
t1 = t2; /* le compilateur rejettera cette instruction */
Un telle affectation ne peut se réaliser qu'à l'aide d'une procédure qui
réalisera l'affectation élément par élément.
2.
Un identificateur ayant le type tableau est converti en une valeur
constante, on ne peut donc rien lui affecter :
int *p;
int t[10];
t = p; /* interdit */
p = t; /* valide */
L'existence des conversions sur les références aux tableaux va avoir deux
conséquences importantes : la
première concerne l'opérateur d'indexation et la seconde le passage de
tableaux en paramètre.