Cours : Structures
Qu'est-ce qu'une structure ?
Les structures sont une forme de type de variable que vous définissez vous-même et qui vous permet de créer des variables qui regroupent plusieurs informations.
Exemple de cas d'utilisation
Imaginons que vous avez un repère avec un système de coordonnées x, y :
0 | 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|---|
0 | ||||||
1 | X | |||||
2 | ||||||
3 | ||||||
4 |
Vous avez 5 lignes et 6 colonnes. En temps normal pour indiquer la position du X vous devriez déclarer deux int :
(Pour rappel : y sont les lignes, x les colonnes et une position s'indique toujours en y;x)
Ces deux valeurs, pos_y et pos_x vont ensemble vous allez quasi toujours les utiliser ensemble. Une structure vous permettrait de les stocker en une seule variable.
Déclarer une structure
La déclaration d'une structure se fait dans un fichier .h.
struct.h
Il se passe deux chose différentes dans l'exemple ci-dessus :
Nous déclarons que nous allons définir un nouveau type de structure en utilisant le mot clé struct. Ensuite nous précisons le nom de notre nouveau type : s_pos.
Nous indiquons que notre structure s_pos va contenir deux variables de type int, une appelée pos_y et l'autre pos_x.
Enfin pour nous faciliter la vie plus tard et ne pas avoir à écrire plein de fois struct s_pos dans notre code, nous utilisons un typedef (type definition) pour indiquer à notre programme que position est un synonyme de struct s_pos.
Utiliser une structure
J'utilise le synonyme que j'ai déclaré dans mon fichier .h pour créer une nouvelle variable de type position que je vais appeler pos. J'aurais également pu l'appeler coord par exemple, je lui donne le nom que je souhaite.
Ensuite je vais remplir les "sous-variables" contenues dans ma structure.
Pour accéder à une sous variable je dois écrire : nom_de_la_struct.nom_de_la_sous_variable
Les structures et les pointeurs
Comme tous les types de variables, il est possible d'utiliser un pointeur qui contient l'adresse d'une structure, mais vous allez voir, il y a un petit changement.
En effet lorsque je manipule un pointeur sur une structure et que je veux manipuler les sous-variables de la structure je dois utiliser structure->variable à la place de structure.variable.
Allouer la mémoire pour une structure
Si votre structure ne contient pas de pointeurs, c'est assez simple :
Par contre si votre structure contient des pointeurs (un char * par exemple), vous allez devoir allouer la mémoire pour la structure puis la mémoire pour chacun des pointeurs qu'elle contient.
Changeons notre exemple
struct.h
main.c
J'alloue la mémoire pour ma structure :
Puis j'alloue la mémoire pour la sous variable qui est un pointeur :