Chapitre 3. Types avancés et classes de stockage

Table des matières
3.1. Structures de données et types complexes
3.2. Les classes de stockage

Le langage C/C++ permet la définition de types personnalisés construits à partir des types de base du langage. Outre les tableaux, que l'on a déjà présentés, il est possible de définir différents types de données évolués, principalement à l'aide de la notion de structure. Par ailleurs, les variables déclarées dans un programme se distinguent, outre par leur type, par ce que l'on appelle leur classe de stockage. La première section de ce chapitre traitera donc de la manière dont on peut créer et manipuler de nouveaux types de données en C/C++, et la deuxième section présentera les différentes classes de stockage existantes et leur signification précise.

3.1. Structures de données et types complexes

En dehors des types de variables simples, le C/C++ permet de créer des types plus complexes. Ces types comprennent essentiellement les structures, les unions et les énumérations, mais il est également possible de définir de nouveaux types à partir de ces types complexes.

3.1.1. Les structures

Les types complexes peuvent se construire à l'aide de structures. Pour cela, on utilise le mot clé struct. Sa syntaxe est la suivante :

struct [nom_structure]
{
    type champ;
   [type champ;
   [...]]
};

Il n'est pas nécessaire de donner un nom à la structure. La structure contient plusieurs autres variables, appelées champs. Leur type est donné dans la déclaration de la structure. Ce type peut être n'importe quel autre type, même une structure.

La structure ainsi définie peut alors être utilisée pour définir une variable dont le type est cette structure.

Pour cela, deux possibilités :

Les éléments d'une structure sont accédés par un point, suivi du nom du champ de la structure à accéder. Par exemple, l'âge de Jean est désigné par Jean.Age.

3.1.2. Les unions

Les unions constituent un autre type de structure. Elles sont déclarées avec le mot clé union, qui a la même syntaxe que struct. La différence entre les structures et les unions est que les différents champs d'une union occupent le même espace mémoire. On ne peut donc, à tout instant, n'utiliser qu'un des champs de l'union.

x peut prendre l'aspect soit d'un entier, soit d'un réel. Par exemple :

affecte la valeur 2 à x.entier, ce qui détruit x.reel.

Si, à présent, on fait :

la valeur de x.entier est perdue, car le réel 6.546 a été stocké au même emplacement mémoire que l'entier x.entier.

Les unions, contrairement aux structures, sont assez peu utilisées, sauf en programmation système où l'on doit pouvoir interpréter des données de différentes manières selon le contexte. Dans ce cas, on aura avantage à utiliser des unions de structures anonymes et à accéder aux champs des structures, chaque structure permettant de manipuler les données selon une de leurs interprétations possibles.

3.1.6. Les alias de types

Le C/C++ dispose d'un mécanisme de création d'alias, ou de synonymes, des types complexes. Le mot clé à utiliser est typedef. Sa syntaxe est la suivante :

typedef définition alias;
alias est le nom que doit avoir le synonyme du type et définition est sa définition. Pour les tableaux, la syntaxe est particulière :
typedef type_tableau type[(taille)]([taille](...));
type_tableau est alors le type des éléments du tableau.

mot est strictement équivalent à unsigned int.

tab est le synonyme de « tableau de 10 entiers ».

Client représente la structure client. Attention à ne pas confondre le nom de la structure (« struct client ») avec le nom de l'alias (« Client »).

Une fois ces définitions d'alias effectuées, on peut les utiliser comme n'importe quel type, puisqu'ils représentent des types :