Tableaux

Un tableau est un moyen de réserver beaucoup de mémoire pour pouvoir stocker un grand volume de données.

int main(void) {
  int tab[50] = {12, 34, 56, 78};
  ...
}
Dans cet exemple, la déclaration a l'effet suivant :
  • un tableau nommé tab est déclaré (c'est une sorte de variable),
  • une zone continue de mémoire, suffisante pour contenir 50 valeurs de type int, est réservée,
  • les quatre premières cases du tableau recoivent les valeurs fournies dans la liste d'initialisation,
  • les cases suivantes recoivent la valeur 0.

Les deux dernières étapes n'ont pas lieu si vous choisissez de ne pas initialiser le tableau. La dernière étape n'a pas lieu si le nombre de valeurs fournies suffit à initialiser toutes les cases (mais le compilateur proteste si la liste contient trop de valeurs).

La valeur placée entre crochets est la capacité du tableau, c'est à dire le nombre de cases qu'il contient. Dans la norme C89, seule une capacité constante est permise (gcc a une autre opinion sur la question, mais nous choisissons de respecter le standard). Si vous omettez la capacité, elle est égale à la longueur de la liste d'initialisation.

Chaque case du tableau se comporte comme une variable, mais ne possède pas d'identificateur. On peut y stocker une valeur, mais pour y accéder il faut passer par une notation spéciale (voir plus loin).

La liste d'initialisation, qui est optionnelle, est formée impérativement de constantes, séparées par des virgules, et encadrées par des accolades. Une telle liste ne peut être utilisée qu'au moment de la déclaration d'un tableau, et donc jamais dans une affectation.

Pour manipuler les cases d'un tableau, il faut en connaître l'adresse. L'opérateur [] permet de calculer puis d'exploiter l'adresse d'une case.

int main(void) {
  char message[] = {'h', 'e', 'l', 'l', 'o'};
  int i;
 
  for(i = 0; i < 5; i++)
    putchar(message[i]);
  putchar('\n');
  return EXIT_SUCCESS;
}
Cet opérateur a besoin (à droite) du tableau qui contient la donnée et (entre les crochets) de l'indice de la case. Cet indice doit toujours être supérieur ou égal à 0 et strictement inférieur à la capacité. On obtient comme résultat la case demandée, qui peut ensuite être utilisée comme une variable (en lecture comme en écriture).

Remarque L'opérateur [] permet de faire des erreurs très dangereuses. Très régulièrement les programmeurs débutants lui fournissent de mauvais indices. Ce problème, appelé dépassement de capacité, est une source fréquente de bogues coriaces.

  1. Remplissage. Écrivez un programme qui déclare un tableau de 10 cases de type int, puis le remplit avec des valeurs choisies aléatoirement entre -50 et 50, et enfin affiche le contenu du tableau.

    bob@box:~$ ./a.out
    +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
    |  12 |   0 | -49 |  35 |   8 |  -2 |  50 |  33 | -40 |  -1 |
    +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
    

    Remarque Les fonctions nécessaires pour la génération pseudo-aléatoire sont décrites dans le deuxième sujet sur les boucles.

  2. Maximum. Modifiez le programme de l'exercice précédent pour qu'il identifie le plus grand élément du tableau.

    bob@box:~$ ./a.out
                               |
                               V
    +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
    |  27 | -33 | -12 | -37 |  48 |  -7 |   0 | -50 |  -3 | -13 |
    +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
    
  3. Recherche. Modifiez le programme du premier exercice pour qu'après l'affichage du tableau, l'utilisateur puisse entrer une valeur. Le programme affichera alors le plus petit indice où on peut trouver cette valeur dans le tableau (ou -1 si la valeur ne s'y trouve pas).

  4. Miroir. Modifiez le programme du premier exercice pour qu'il inverse l'ordre des valeurs du tableau. Vous afficherez le tableau avant et après inversion pour vérifier votre travail.

  5. Filtre. Reprenez le programme du premier exercice. Après avoir affiché le tableau, retirez-en toutes les valeurs négatives (sans changer l'ordre des autres valeurs) puis affichez-le à nouveau.

  6. Circulation. Modifiez le programme du premier exercice pour qu'il avance les valeurs du tableau de 4 indices (les valeurs à la fin se retrouveront au début). Vous afficherez le tableau avant et après permutation pour vérifier votre travail.

    Remarque La valeur 4 est arbitraire. Faites-en une constante nommée et assurez-vous que le programme marche aussi pour d'autres valeurs de décalage.

retour à la page d'accueil

retour au sommet