Les structures
Les structures sont des variables crées par ... vous même
Les structures sont très utiles et permettent de faire un nombre incroyable de choses
Prenons un exemple:
Vous programmez un jeu comme Mario sauf que dans votre jeu, il y a plusieurs personnages jouant en même temps: Personnage1, Personnage2, et Personnage3.
Vous devez donc, pour chaque personnage, créer un certain nombre de variables (pour la vie, la direction où il va, sa position sur l'écran, le nombre de pièce récupérés, etc...).
Seulement voilà: Imaginons qu'il vous faut 5 variables par personnages, il vous faudra créer 15 variables en tout! Et ce n'est pas tout! Imaginons encore qu'il vous faut, pour une raison X, ajouter un nouveau personnage!
Vous le voyez, cela ne serez pas évident et on s'emmelerait les pinceaux à savoir à quel personnage appartient telle variable etc...
Mais là où je veux en venir, c'est que, grâce aux strcutures, vous pouvez pallier ce problème très facilement!
Voici comment se déclare une structure en langage C:
struct nomStructure
{
//Variables.
}; //Oui, il y a un point virugule!
Vous devez impérativement mettre un point virgule après l'accolade fermente
Les variables peuvent être de type différent.
Regardons ce que cela donnerais avec mon précédent exemple de Mario:
struct Personnage
{
int nombreDePieces;
int viesRestantes
;
};
Remarquez que vous pouvez rajouter autant de variables de n'importe quel type souhaité
Vous venez de créer votre propre type de variable! Il vous faut maintenant savoir comment l'utiliser

Pour cela, il vous suffit de déclarer votre type de variable comme une variable classique en rajoutant le mot clé "struct" comme ceci:
struct Personnage
{
int nombreDePieces;
int viesRestantes
;
};
//On déclare une variable se nommant "Personnage1" de type Personnage.
struct Personnage Personnage1
;
Si vous ne souhaitez pas écrire le mot "struct" à chaque fois que vous créer une variable de votre nouveau type, vous pouvez utiliser "typedef" comme ceci:
typedef struct Personnage Personnage
;
struct Personnage
{
int nombreDePieces;
int viesRestantes
;
};
//On déclare une variable se nommant "Personnage1" de type Personnage.
Personnage Personnage1
;
Le typedef remplace juste le "struct Personnage" par simplement "Personnage" dans tout votre code, ce qui est beaucoup plus pratique et permet de rendre le code encore plus lisible
Utilisation d'une structure
Pour accéder aux différentes variables qui composent votre nouveau type, il vous suffit décrire le nom de votre structure suivit d'un point et enfin du nom de la variable à laquelle vous souhaitez accéder. Comme ceci:
typedef struct Personnage Personnage
;
struct Personnage
{
int nombreDePieces;
int viesRestantes
;
};
//On déclare une variable se nommant "Personnage1" de type Personnage.
Personnage Personnage1
;
//La variable "viesRestantes" de la structure Personnage1 vaut maintenant 4.
Personnage1
.viesRestantes
= 4;
Passer une structure une fonction
Les structures étant des types de variables de la même manière qu'un int ou un char, vous pouvez créer avec vos structures des pointeurs

Rien que de vous l'avoir anoncé je sens que vous êtes heureux
Imaginons que vous souhaitez créer un pointeur de type Personnage (la définition de la structure est celle juste ci-dessus) il vous suffira d'écrire ceci:
Personnage
*monPointeur
= NULL
;
Il faut bien comprendre qu'en créant une structure, vous créez un nouveau type de variable!
Ce petit rappel sur les pointeurs étant fait, passons maintenant à l'étape supérieure: comment passer une structure à une fonction?
Nous allons pour cela prendre un exemple qui mettra à 6 le nombre de vies restantes et à 10 le nombre de pièces. Je vous laisse regarder le code avec les commentaires, je vous explique tout cela juste après
#include <stdlib.h>
#include <stdio.h>
//Nous définnissons ici un nouveau type de variable grâce à une structure.
typedef struct Personnage Personnage
;
struct Personnage
{
int nombreDePieces;
int viesRestantes
;
};
void fonction
(Personnage
*Personnage1
); //Prototype de la fonction utilisée après.
int main
()
{
Personnage Personnage1
; //On créer une variable de type Personnage.
fonction
(&Personnage1
); //On fournit à la fonction l'adresse de la variable crée.
printf
("nombre de vie: %d nombre de pieces: %d", Personnage1
.viesRestantes
, Personnage1
.nombreDePieces
); //On affiche les variables de la structure.
return 0;
}
//Notre fonction.
void fonction
(Personnage
*Personnage1
) /*On récupère l'adresse de la structure par un pointeur du même type.*/
{
//Nous allons voir pourquoi cette écriture juste après :)
Personnage1
->nombreDePieces
= 10;
Personnage1
->viesRestantes
= 6;
}
Oui, j'ai abusé en commentaire
Une petite précision tout d'abord:
Il est impératif de déclarer votre structure en globale (avant le main et les prototypes) car il faut indiquer au programme que vous créez un nouveau type de variable
Revenons maintenant sur l'utilisation des structures dans une fonction. Dans cet exemple, je voulais modifier les variables. J'ai, pour cela, écrit ceci:
Personnage1->nombreDePieces = 10;
Personnage1->viesRestantes = 6;
Tout simplement car il s'agit d'un pointeur, et que pour faire référence à la valeur pointée (et non l'adresse) il faut rajouter une flèche "->" devant la variable souhaitée.
Ceci ne marche que pour les pointeurs
Nous pouvons donc en conclure que:
pour accéder à une structure déclarée dans la fonction actuelle on utilise le point "."
pour accéder à une structure donnée en paramètre, on utilise la flèche "->"
Vous voilà rodé pour les structures :P
Encore une fois, j'insiste sur le fait que si une explication ne vous semble pas claire, il vous suffit de poser une question
ici, nous nous ferons un plaisir d'y répondre
Voyons maintenant, dans le chapitre suivant, la gestion des fichiers en langage C
Les pointeurs et la gestion des adresses La gestion des fichiers