Exood4 Studio - Video Game Development, Toulouse (France)
Exood4 Studios Exood4 Tutorials

   
L a n g a g e   C

L e s   t a b l e a u x






La dfinition


 Si T est un type, on peut construire un objet de type tableau de T par :

 T objet [expression_constante] (chaque lment du tableau est de type T)

int tab[10]; /* tableau de 10 entiers */

 Cependant, on ne peut pas dfinir de tableaux de fonctions : les tableaux peuvent contenir des pointeurs de fonctions, mais pas les fonctions elles-mmes.

 Les tableaux plusieurs dimensions se dclarent de la manire suivante :

int damier[8][8]; /* tableau 2 dimensions */
float cube[10][10][10];   /* tableau 3 dimensions */





Les lments


 Les lments d'un tableau ont un indice compris entre 0 et (nombre d'lments - 1).

int tab[5]; /* lments : tab[0], tab[1] ... tab[4] */

 L'ordre en mmoire des lments d'un tableau plusieurs dimensions est le suivant :

float mat[2][2]; /* mat [0][0], mat[0][1], mat[1][0] et mat[1][1] */


 Pour "balayer" les lments d'un tableau squentiellement, on fait varier les indices en commenant par la droite :


Exemple :

unsigned int ecran[600][800]; /* cran de taille 800 (largeur) x 600 (hauteur) */

ecran[y][x] est quivalent *(ecran + y*800 + x)


L'initialisation


 Un tableau peut tre initialis lors de sa dfinition avec des valeurs constantes :

int tab[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
char message[6] = { 'e' , 'r', 'r', 'e', 'u', 'r' };


 On peut ne pas mentionner le nombre d'lments lorsqu'un tableau est initialis lors de sa dfinition, celui-ci sera alors gal au nombre de valeurs fournies :

int tab[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; /* quivalent la dfinition prcdente */
char message[] = { 'e' , 'r', 'r', 'e', 'u', 'r' };   /* quivalent la dfinition prcdente */

 Un nombre de constantes suprieures la taille du tableau provoque une erreur de compilation. Par contre si ce nombre est infrieur, les lments restants sont initialiss 0 :

int tab[5] = { 1, 2, 3 }; /* quivalent { 1, 2, 3, 0, 0 } */


Prcisions sur la dfinition


 En rgle gnrale, le nombre d'lments d'un tableau peut tre omis s'il n'est pas ncessaire au compilateur c'est dire si :
  • le tableau juste dclar, alors qu'il est dj dfini : extern int tab[];

  • le tableau est un paramtre de fonction : void f (int tab[]);

  • le tableau est initialis lors de sa dfinition
 Par consquent, pour un tableau multidimensionnel, afin que le compilateur puisse dterminer la fonction d'indexation, seule la premire dimension peut tre omise.

extern int matrice[][10];

void f (int matrice[][10]);


Tableaux et pointeurs


 Si tab est un tableau sizeof(tab) donne la taille du tableau (nombre d'lments * taille d'un lment). La rfrence &tab donne l'adresse du tableau.

 Hormis ces deux cas (calcul de la taille et de la rfrence), dans toute autre expression, tab est converti en un pointeur sur le premier lment du tableau (&tab[0]). Aussi nous pouvons exprimer les indices en terme d'arithmtique de pointeurs :

 tab[i] est quivalent *(tab+i), de mme tab[1][2] est quivalent *(*(tab+1)+2) ...

 On peut ainsi utiliser les pointeurs pour disposer de tableaux dynamiques : crs avec malloc ou calloc, leur taille peut tre ajuste avec realloc et ils sont dtruits avec free :

int *tab;

tab = malloc (nb * sizeof(int));
for (i = 0; i < nb; i++)
scanf ("%d", &tab[i]);


Tableaux et fonctions


 Lorsqu'un tableau est pass en paramtre une fonction, conformment la rgle ci-dessus, l'expression f(tab) est convertie en f(&tab[0]). Par consquent, bien que le seul mcanisme en C soit le passage par valeur, et qu'effectivement &tab[0] soit recopi localement, le tableau se retrouve transmis par adresse, et toute modification de ses lments se rpercute dans la fonction appelante.

 Autre consquence : un tableau peut tre pass en paramtre une fonction qui attend un pointeur, et rciproquement. Par exemple si tab est dclar par :

int tab[10];

 l'appel f(tab) est valide pour une fonction f dclare ainsi :

void f (int [10]);
void f (int []);
void f (int *);

 Une fonction ne peut pas retourner un tableau, mais seulement l'adresse de son premier lment, ou l'adresse du tableau lui-mme.


Oprations sur les tableaux


 L'affectation entre tableaux et la comparaison de deux tableaux n'existent pas en C.

 tab1 = tab2 provoque une erreur de compilation, puisque tab1, converti en l'adresse de son premier lment, est une constante. La recopie doit tre effectue soit lment par lment, soit avec une fonction de copie de blocs mmoire comme memcpy.

memcpy (tab1, tab2, sizeof(tab2));

 Par contre tab1 == tab2 est valide, mais il s'agit d'un test sur l'galit entre deux pointeurs.

void f (int tab2[])
{
 if (tab1 == tab2) erreur();
 ...
}

 Pour comparer le contenu de deux tableaux, soit on compare les lments les uns aprs les autres, soit on utilise une fonction de comparaison de blocs mmoire comme memcmp :

memcmp (tab1, tab2, nombre_elements_a_comparer);



  Retour en haut de page Page suivante