Programmer en langage C
138
© Éditions Eyrolles
L’en-tête de fct peut être indifféremment écrit de l’une des manières suivantes :
void fct (int t[10])
void fct (int * t)
void fct (int t[])
La dernière écriture se justifie par le fait que t désigne un argument muet. La réservation de
l’emplacement mémoire du tableau dont on recevra ici l’adresse est réalisée par ailleurs dans
la fonction appelante (d’ailleurs cette adresse peut changer d’un appel au suivant). D’autre
part, la connaissance de la taille exacte du tableau n’est pas indispensable au compilateur ; il
est en effet capable de déterminer l’adresse d’un élément quelconque, à partir de son rang et de
l’adresse de début du tableau (nous verrons qu’il n’en ira plus de même pour les tableaux à
plusieurs indices). Dans ces conditions, on comprend qu’il soit tout à fait possible de ne pas
mentionner la dimension du tableau dans l’en-tête de la fonction. En fait, le 10 qui figure dans
le premier en-tête n’a d’intérêt que pour le lecteur du programme, afin de lui rappeler la
dimension effective du tableau sur lequel travaillait notre fonction.
Par ailleurs, comme d’habitude, quel que soit l’en-tête employé, on peut, dans la définition de
la fonction, utiliser indifféremment le formalisme tableau ou le formalisme pointeur. Voici
plusieurs écritures possibles de fct qui s’accommodent de n’importe lequel des trois en-têtes
précédents (elles supposent que i a été déclaré de type int) :
for (i=0 ; i<10 ; i++) t[i] = 1 ;
for (i=0 ; i<10 ; i++, t++) *t = 1 ;
for (i=0 ; i<10 ; i++) *(t+i) = 1 ;
for (i=0 ; i<10 ; i++) t[i] = 1 ;
(ici encore, l’expression t++ ne pose aucun problème car t représente une copie de l’adresse
d’un tableau ; t est donc bien une lvalue et elle peut donc être incrémentée).
Voici enfin une dernière possibilité dans laquelle nous recopions l’adresse t dans un pointeur
p et où nous utilisons les possibilités de comparaison de pointeurs :
int * p ;
for (p=t ; p b) Second exemple : tableau de taille variable
Comme nous venons de le voir, lorsqu’un tableau à un seul indice apparaît en argument d’une
fonction, le compilateur n’a pas besoin d’en connaître la taille exacte. Il est ainsi facile de réaliser une fonction capable de travailler avec un tableau de dimension quelconque, à condition
de lui en transmettre la taille en argument. Voici, par exemple, une fonction qui calcule la
somme des éléments d’un tableau d’entiers de taille quelconque :
Delannoy Livre.book Page 138 Mercredi, 6. mai 2009 4:26 16
Précédent

- 151/281

Suivant