Tableaux à deux dimensions et passages de paramètres en langage C

Dans le langage C, les crochets que l’on utilise pour encadrer les index d’un tableau ne sont, en réalité, qu’une façon de déréférencer un pointeur.
Si ptr est un pointeur, et n un nombre entier, alors l’expression ptr[n] est strictement équivalente à *(ptr + n). Vous pourrez vérifier que ces deux notations sont équivalentes par vous-même.
Ces deux notations permettent de déréférencer un pointeur sur un tableau à une dimension.

Intéressons-nous maintenant au cas d’un tableau à deux dimensions défini de la manière suivante :
int matrice[NB_LIGNES][NB_COLONNES]
Dans ce cas, l’expression matrice[ligne][colonne] est strictement équivalente à :
matrice[(NB_COLONNES * ligne) + colonne]
elle-même strictement équivalente à :
*(matrice + (NB_COLONNES * ligne) + colonne)
Ainsi, le compilateur a besoin du nombre de colonnes d’un tableau à deux dimensions pour pouvoir réinterpréter une notation du type matrice[ligne][colonne]. C’est pourquoi cette dimension doit être précisée lors du passage d’un tableau à deux dimensions comme paramètre d’une fonction.
En fait, lors de la transmission d’un vrai tableau à deux dimensions, le paramètre effectivement transmis est un pointeur sur le premier sous-tableau, et non un pointeur sur le premier élément.
Le passage du tableau matrice à une fonction devra donc se faire de la façon suivante :
void fonction(int (*matrice)[NB_COLONNES]) ;
Une autre notation possible, bien qu’elle masque la véritable nature du paramètre transmis (ce qui n’est pas bien), est :
void fonction(int matrice[][NB_COLONNES]) ;
L’inconvénient évident est que les fonctions ainsi définies ne sont absolument pas générales puisqu’elles ne peuvent manipuler qu’un tableau de NB_COLONNES. Le prix de la généricité est l’abandon du vrai tableau au profit de l’allocation dynamique.

Cette entrée a été publiée dans Enseignement. Placez un signet sur le permalien.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *