
Un tableau est une collection d'éléments d'un seul et même type. Les éléments individuels ne sont pas nommés ; on accède à chacun d'eux par leur position dans le tableau, repéré par un indice. La taille d'un tableau est le nombre des cellules représentant chacun des éléments. Cette taille doit être connue dès la déclaration car elle conditionne avec le type, la place mémoire allouée au tableau.
Une fois que la déclaration du tableau est réalisée, il est possible de récupérer ou de modifier chacune des cellules du tableau. Les cellules ne sont pas nommées, la seule possibilité de les repérer est d'utiliser leur position dans le tableau. Il suffit alors d'utiliser la syntaxe des crochets [ ] avec à l'intérieur l'indice correspondant à la cellule à atteindre.

Il est possible, comme pour les variables simples, d'initialiser explicitement le tableau dès sa déclaration. Il suffit alors de préciser la liste des valeurs entre accolades séparées par des virgules. Normalement, le nombre de valeurs initiales dans votre liste doit correspondre à la dimension de votre tableau. Toutefois, si ce nombre est inférieur, les éléments non explicitement initialisés prendront la valeur 0. Attention, la liste des valeurs ne doit pas dépasser la dimension du tableau. Pour éviter de se tromper, il est possible de ne pas spécifier explicitement la dimension du tableau. Le compilateur déterminera alors sa taille grâce au nombre d'éléments listés.

Le nom du tableau correspond uniquement à l'adresse de l'emplacement mémoire de la première case. Cette adresse est fixe pendant tout le déroulement du programme. Il n'est donc pas permis d'affecter directement un tableau à l'aide d'un autre, d'une part, parce que un tableau n'est pas représenté par la totalité de ses cases, et d'autre part, parce que justement cette adresse est définitivement figée. Si nous désirons, malgré tout, avoir une copie du premier tableau, nous sommes obligés de remplir le nouveau tableau, cellule par cellule, à l'aide d'une itérative.

Une chaîne de caractères est une collection de caractères. Elle correspond donc à la définition du tableau. C'est en fait, un cas particulier d'un tableau de caractères, qui comporte un caractère supplémentaire de fin de chaîne qui s'appelle le caractère nul terminal ‘ \0 ' . C'est un caractère de contrôle.
Un tableau de caractères peut-être initialisé soit avec une liste de caractères littéraux séparés par des virgules, soit avec une constante littérale chaîne. Remarquons toutefois que les deux formes ne sont pas équivalentes. La différence se situe au niveau du caractère nul terminal.


Les tableaux multidimensionnels peuvent également être définis. Chaque dimension est spécifiée avec sa propre paire de crochets, par exemple :


Grâce à cette technique il est possible d'implémenter des tableaux de chaînes de caractères. Dans l'exemple qui suit, nous demandons à avoir un tableau de 3 chaînes de caractères. Chacune d'entre elle dispose de 10 cases :
char personnages[3][10] = { « Tintin », « Milou », « Tournesol »} ;
Dans ce genre de situation, il faut être très attentif. Nous devons faire en sorte de disposer de suffisamment de place pour que la chaîne puisse être introduite en entier. Attention au caractère terminal nul. Du coup, certaines cases mémoires ne seront peut-être jamais utilisées. Tant pis, il faut faire un choix, et il est préférable d'avoir toutes les chaînes utilisables.
Souvent lors d'une programmation, il est nécessaire de définir un ensemble d'attributs alternatifs à associer à un objet. Un fichier, par exemple, peut être ouvert dans l'un de ces trois états : lecture, écriture, ajout. Généralement, on garde une trace de ces valeurs et attributs d'état en associant un nombre constant unique à chacun, comme suit :
const int lecture = 0 ;
const int ecriture = 1 ;
const int ajout = 2 ;
Cette approche fonctionne très bien, mais elle présente un certain nombre de faiblesses. La principale est qu'il n'existe aucun moyen de contraindre une variable (donc de type entier) à rester sur l'une de ces trois valeurs uniquement, puisque, par définition, cette variable peut prendre beaucoup plus de valeurs dans le monde des entiers.
Les énumérations sont un moyen commode de regrouper des constantes, lorsqu'elles ont une signification voisine, ou reliée.
enum ModeOuverture { lecture, ecriture, ajout } ;
Les énumérations permettent donc de définir, mais également de grouper des ensembles de constantes entières. Bien plus, grâce à elle, nous venons de créer de toute pièce un nouveau type : ModeOuverture (type défini par l'utilisateur). Comme c'est un type, il est possible de déclarer des variables associées et même de l'initialiser.
ModeOuverture fichier = lecture ;
Nous indiquons ainsi que fichier ne prendra que l'une des trois valeurs alternatives prévues par l'énumération.

L'énumération présente l'énorme avantage de travailler avec des mots qui évoquent quelque chose plutôt que de manipuler des nombres qui en tant que tel ne veulent rien dire. Par exemple, si nous décidons de faire un logiciel sur un jeu de cartes, il est judicieux d'évoquer par exemple la couleur de ces cartes :
enum CouleurCarte { Pique, Cœur, Carreau, Trefle } ;
La page suivante vous donne quelques exemples et montre l'intérêt de l'énumération.

Les données d'un programme sont rarement dispersées. Elles peuvent en général être pensées sous la forme de groupes plus ou moins important, ayant une cohérence significative. Par exemple, dans la gestion de personnel, on utilisera des fiches contenant le nom, le prénom, l'âge, l'adresse, etc., de chaque employé. Il serait peu logique de placer chacun des éléments de ces fiches dans des tableaux différents, car cela compliquerait la recherche de l'ensemble des caractéristiques d'un employé donné.

Alors qu'un tableau recueille des éléments de même nature, une structure associe des éléments d'entités différentes. A l'inverse du tableau, chaque champ possède son propre nom, ce qui offre plus de souplesse d'utilisation.
Généralement, nous fabriquons d'abord la structure à laquelle nous associons un nom de type, et plus tard, nous déclarons toutes les variables associées à cette structure.
Exceptionnellement, nous pouvons directement déclarer une variable structurée sans lui associée de nom de type ; la structure est alors anonyme.
Comme pour les tableaux, Il est possible d'initialiser explicitement la structure dès sa déclaration. Il suffit alors de préciser la liste des valeurs entre accolades séparées par des virgules. S'il y a moins de valeurs d'initialisation que de champs dans la structure, le procédé est analogue à ce qui se passe dans les tableaux. Les champs pour lesquels il n'y a pas de valeur sont initialisés à 0. Ceci dit, il est quand même préférable de bien initialiser explicitement.

Lorsque vous avez des structures à l'intérieur d'autres structures, au moment de l'initialisation, vous vous retrouvez avec des accolades imbriquées. Vous avez la possibilité de supprimer les accolades intérieures. Toutefois, pensez à la clarté de votre code.

Une fois que la déclaration est faite, nous pouvons utiliser la structure soit dans son ensemble, soit avec un des champs uniquement, comme nous venons de le découvrir.

Ce qui est très intéressant, c'est que nous pouvons affecter directement une structure vers une autre. Les champs sont alors copiés un à un, c'est ce que nous appelons une copie membre à membre. Dès lors, la deuxième structure devient un clône de la première. Cette technique peut être appliquée également au moment de l'initialisation.

Par contre, si nous désirons changer de valeurs sur la totalité d'une structure, il n'est pas possible d'utiliser la syntaxe des accolades comme lors d'une initialisation. Nous sommes obligés d'affecter chacun des champs séparément.
Il est extrêmement fréquent d'utiliser des tableaux de structures pour représenter par exemple l'ensemble des fiches des employés d'une entreprise. Chaque fiche est alors accessible par le numéro d'indice du tableau.
