Programmation en C – Les structures

Les tableaux permettent de définir le type de variables qui peut contenir plusieurs éléments de données du même type. De même, une structure est un autre type de données défini par l’utilisateur  qui permet de combiner des éléments de type différents.
 
 

Définir une structure

Pour définir une structure, vous devez utiliser l’instruction struct. L’instruction struct définit un nouveau type de données avec plusieurs membres. Le format de l’instruction struct est le suivant

struct [tag] {
   membre 1;
   membre 2;
   …
   membre n;
} [une ou plusieurs variables];  

La balise [tag] est facultative et chaque définition de membre est une définition de variable normale, telle que int i; ou float f; ou toute autre définition de variable valide. À la fin de la définition de la structure, avant le point-virgule final, vous pouvez spécifier une ou plusieurs variables de structure, mais cette option est facultative. Voici comment vous pouvez déclarer une structure en C.

struct Livres {
   char  titre[50];
   char  auteur[50];
   char  sujet[100];
   int   livre_id;
} livre;   

 

Accès aux membres de la structure

Pour accéder à n’importe quel membre d’une structure, nous utilisons l’opérateur « . ». L’opérateur d’accès d’un membre est codé comme un point entre le nom de la variable de structure et le membre de structure auquel nous souhaitons accéder. Vous utiliseriez le mot-clé struct pour définir les variables du type de structure. L’exemple suivant montre comment utiliser une structure dans un programme

#include <stdio.h>
#include <string.h>
 
struct Livres {
   char  titre[50];
   char  auteur[50];
   char  sujet[100];
   int   livre_id;
} livre; 
 
int main( ) {

   struct Livres livre1;        /* Déclare livre1 de type Livre */
   struct Livres  livre2;        /* Déclare livre2 de type Livre */
 
   /* livre 1 spécification*/
   strcpy( livre1.titre, "Programmation C");
   strcpy( livre1.auteur, "Yaka MainProgramming"); 
   strcpy( livre1.sujet, "Les structures en C");
   livre1.livre_id= 6495407;

   /* livre 2 spécification*/
   strcpy( livre2.titre, "Programmation C++");
   strcpy( livre2.auteur, "AWER MainProgramming");
   strcpy( livre2.sujet, "Les structures en C++");
   livre2.livre_id= 14598759;
 
   /* afficher les informations du livre1 */
   printf( "Livre 1 titre: %sn", livre1.titre);
   printf( "Livre 1 auteur: %sn", livre1.auteur);
   printf( "Livre 1 subject : %sn", livre1.sujet);
   printf( "Livre 1 livre_id: %dn", livre1.livre_id );

   /* afficher les informations du livre2 */
   printf( "Livre 2 titre: %sn", livre2.titre);
   printf( "Livre 2 auteur: %sn", livre2.auteur);
   printf( "Livre 2 sujet: %sn", livre2.sujet);
   printf( "Livre 2 livre_id: %dn", livre2.livre_id);

   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant:

Livre 1 titre: Programmation C
Livre 1 auteur: Yaka MainProgramming
Livre 1 subject : Les structures en C
Livre 1 livre_id: 6495407
Livre 2 titre: Programmation C++
Livre 2 auteur: AWER MainProgramming
Livre 2 sujet: Les structures en C++
Livre 2 livre_id: 14598759

 
 

Structures en tant qu’arguments de fonction

Vous pouvez passer une structure en tant qu’argument à une fonction comme vous passez une variable.

#include <stdio.h>
#include <string.h>
 
struct Livres {
   char  titre[50];
   char  auteur[50];
   char  sujet[100];
   int   livre_id;
} livre; 
 
/* déclaration de fonction */
void afficherLivre( struct Livres livre );
 
int main( ) {

   struct Livres livre1;        /* Déclare livre1 de type Livre */
   struct Livres  livre2;        /* Déclare livre2 de type Livre */
 
   /* livre 1 spécification*/
   strcpy( livre1.titre, "Programmation C");
   strcpy( livre1.auteur, "Yaka MainProgramming"); 
   strcpy( livre1.sujet, "Les structures en C");
   livre1.livre_id= 6495407;

   /* livre 2 spécification*/
   strcpy( livre2.titre, "Programmation C++");
   strcpy( livre2.auteur, "AWER MainProgramming");
   strcpy( livre2.sujet, "Les structures en C++");
   livre2.livre_id= 14598759;
 
   /* afficher les informations du livre1 */
    afficherLivre( livre1 );

   /* afficher les informations du livre2 */
    afficherLivre( livre2 );

   return 0;
}

void afficherLivre( struct Livres livre ) {
    
   printf( "Livre titre: %sn", livre.titre);
   printf( "Livre auteur: %sn", livre.auteur);
   printf( "Livre sujet: %sn", livre.sujet);
   printf( "Livre livre_id: %dn", livre.livre_id);
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :

Livre titre: Programmation C
Livre auteur: Yaka MainProgramming
Livre sujet: Les structures en C
Livre livre_id: 6495407
Livre titre: Programmation C++
Livre auteur: AWER MainProgramming
Livre sujet: Les structures en C++
Livre livre_id: 14598759

 

Pointeurs vers les structures

Vous pouvez définir des pointeurs vers des structures de la même manière que vous définissez le pointeur vers une autre variable

struct Livres *structPtr;

Vous pouvez maintenant stocker l’adresse d’une variable de structure dans la variable de pointeur définie ci-dessus. Pour trouver l’adresse d’une variable de structure, placez le ‘&’ opérateur avant le nom de la structure comme suit

structPtr = &livre1;

Pour accéder aux membres d’une structure en utilisant un pointeur vers cette structure, vous devez utiliser l’opérateur comme suit

structPtr ->title;

Réécrivons l’exemple ci-dessus en utilisant un pointeur de structure.

#include <stdio.h>
#include <string.h>
 
struct Livres {
   char  titre[50];
   char  auteur[50];
   char  sujet[100];
   int   livre_id;
}; 
 
/* déclaration de fonction */
void afficherLivre( struct Livres *livre );
 
int main( ) {

   struct Livres livre1;        /* Déclare livre1 de type Livre */
   struct Livres  livre2;        /* Déclare livre2 de type Livre */
 
   /* livre 1 spécification*/
   strcpy( livre1.titre, "Programmation C");
   strcpy( livre1.auteur, "Yaka MainProgramming"); 
   strcpy( livre1.sujet, "Les structures en C");
   livre1.livre_id= 6495407;

   /* livre 2 spécification*/
   strcpy( livre2.titre, "Programmation C++");
   strcpy( livre2.auteur, "AWER MainProgramming");
   strcpy( livre2.sujet, "Les structures en C++");
   livre2.livre_id= 14598759;
 
   /* afficher les informations du livre1 */
    afficherLivre( &livre1 );

   /* afficher les informations du livre2 */
    afficherLivre( &livre2 );

   return 0;
}

void afficherLivre( struct Livres *livre ) {
    
   printf( "Livre titre: %sn", livre->titre);
   printf( "Livre auteur: %sn", livre->auteur);
   printf( "Livre sujet: %sn", livre->sujet);
   printf( "Livre livre_id: %dn", livre->livre_id);
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :

Livre titre: Programmation C
Livre auteur: Yaka MainProgramming
Livre sujet: Les structures en C
Livre livre_id: 6495407
Livre titre: Programmation C++
Livre auteur: AWER MainProgramming
Livre sujet: Les structures en C++
Livre livre_id: 14598759

 
 

Champs de bits

Les champs de bits permettent l’empilement de données dans une structure. Ceci est particulièrement utile lorsque la mémoire ou le stockage de données est essentiel. Des exemples typiques comprennent :

Emballer plusieurs objets dans un mot machine. par exemple. Les drapeaux de 1 bit peuvent être compactés.

Lecture des formats de fichiers externes – formats de fichier non standard pourraient être lus, par exemple, des entiers de 9 bits.

C nous permet de le faire dans une définition de structure en mettant: longueur de bit après la variable. Par exemple

struct boxes {
   unsigned int fl1:1;
   unsigned int fl2:1;
   unsigned int fl3:1;
   unsigned int fl4:1;
   unsigned int type:4;
   unsigned int entier:9;
} boxe;

Ici, le fichier boxes contient 6 membres: quatre indicateurs de 1 bit fl1..fl3, un type de 4 bits et un entier de 9 bits.

C compresse automatiquement les champs de bits ci-dessus de façon aussi compacte que possible, à condition que la longueur maximale du champ soit inférieure ou égale à la longueur du mot entier de l’ordinateur. Si ce n’est pas le cas, alors certains compilateurs peuvent autoriser le chevauchement de la mémoire pour les champs tandis que d’autres vont stocker le champ suivant dans le mot suivant.
 
 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.