© Éditions Eyrolles
133
chapitre n° 7
Les tableaux et les pointeurs
Important. Nous venons de voir que la notation t[i] est équivalente à *(t+i) lorsque t
est déclaré comme un tableau. En fait, cela reste vrai, quelle que soit la manière dont t a été
déclaré. Ainsi, avec :
int * t ;
les deux notations précédentes resteraient équivalentes. Autrement dit, on peut utiliser t[i]
dans un programme où t est simplement déclaré comme un pointeur (encore faudra-t-il, toutefois, avoir alloué l’espace mémoire nécessaire).
6.2 Cas des tableaux à plusieurs indices
Comme pour les tableaux à un indice, l’identificateur d’un tableau, employé seul, représente
toujours son adresse de début. Toutefois, si l’on s’intéresse à son type exact, il ne s’agit plus
d’un pointeur sur des éléments du tableau. En pratique, ce point n’a d’importance que lorsque
l’on effectue des calculs arithmétiques avec ce pointeur (ce qui est assez rare) ou lorsque l’on
doit transmettre ce pointeur en argument d’une fonction ; dans ce dernier cas, cependant, nous
verrons que le problème est automatiquement résolu par la mise en place de conversions, de
sorte qu’on peut ne pas s’en préoccuper.
À simple titre indicatif, nous vous présentons ici les règles employées par C, en nous limitant
au cas de tableaux à deux indices.
Lorsque le compilateur rencontre une déclaration telle que :
int t[3] [4] ;
il considère en fait que t désigne un tableau de 3 éléments, chacun de ces éléments étant luimême un tableau de 4 entiers. Autrement dit, si t représente bien l’adresse de début de notre
tableau t, il n’est plus de type int * (comme c’était le cas pour un tableau à un indice) mais
d’un type « pointeur sur des blocs de 4 entiers », type qui devrait se noter théoriquement (vous
n’aurez probablement jamais à utiliser cette notation :
int [4] *
Dans ces conditions, une expression telle que t+1 correspond à l’adresse de t, augmentée de
4 entiers (et non plus d’un seul !). Ainsi, les notations t et &t[0][0] correspondent toujours
à la même adresse, mais l’incrémentation de 1 n’a pas la même signification pour les deux.
D’autre part, les notations telles que t[0], t[1] ou t[i] ont un sens. Par exemple, t[0]
représente l’adresse de début du premier bloc (de 4 entiers) de t, t[1], celle du second bloc...
Cette fois, il s’agit bien de pointeurs de type int *. Autrement, dit les notations suivantes
sont totalement équivalentes (elles correspondent à la même adresse et elles sont de même
type) :
t[0]
&t[0][0]
t[1]
&t[1][0]
Delannoy Livre.book Page 133 Mercredi, 6. mai 2009 4:26 16
Précédent

- 146/281

Suivant