SlideShare une entreprise Scribd logo
1  sur  44
Télécharger pour lire hors ligne
Cours de C

                      Types structurés

                      Sébastien Paumier




paumier@univ-mlv.fr      Illustrations provenant du site http://tux.crystalxp.net/   1
Les structures

●   objets regroupant plusieurs données
    appelées "champs"
●   à définir hors d'une fonction
●   définition:
    struct nom {
         type_champ1 nom_champ1;
         type_champ2 nom_champ2;
         ...
    };
paumier@univ-mlv.fr                       2
Les structures

●   déclaration d'une variable:
    struct nom_type nom_var;
●   accès aux champs: nom_var.nom_champ
              struct complex {
                 double real;
                 double imaginary;
              };

              int main(int argc,char* argv[]) {
                 struct complex c;
                 c.real=1.2;
                 c.imaginary=6.3;
                 printf("%f+%f*in",c.real,c.imaginary);
                 return 0;
              }



paumier@univ-mlv.fr                                        3
Choix des champs

●   on peut mettre tout ce dont le
    compilateur connaît la taille
●   on ne peut donc pas mettre la structure
    elle-même:
                       struct list {
                          int value;
                          struct list next;
                       };




$>gcc -Wall -ansi struct.c
struct.c:7: champ « next » a un type incomplet

paumier@univ-mlv.fr                              4
Structures récursives

●   mais on peut mettre un pointeur sur la
    structure, car la taille des pointeurs est
    connue:

                      struct list {
                         int value;
                         struct list* next;
                      };




paumier@univ-mlv.fr                              5
Imbrication de structures

●   un champ peut être une structure:
    struct id {
       char firstname[MAX];
       char lastname[MAX];
    };

    struct people {                       pas d'ambiguïté car le
       struct id id;                      type ne s'appelle pas
       int age;
    };                                    id mais struct id
    int main(int argc,char* argv[]) {
       struct people p;
       strcpy(p.id.firstname,"Master");
       strcpy(p.id.lastname,"Yoda");
       p.age=943;
       /* ... */
       return 0;
    }


paumier@univ-mlv.fr                                           6
Imbrication de structures

●   2 structures peuvent s'appeler l'une
    l'autre, à condition d'utiliser des
    pointeurs:
                      struct state {
                         struct transition* t;
                         char final;
                      };

                      struct transition {
                         char letter;
                         struct state* dest;
                         struct transition* next;
                      };




paumier@univ-mlv.fr                                 7
Contraintes sur les structures

●   champs organisés dans l'ordre de leur
    déclarations:
                         struct foo {
                            int a;
                            char b;
                            float c;
                         };

                         int main(int argc,char* argv[]) {
                            struct foo f;
                            printf("%p < %p < %pn",
                                   &(f.a),&(f.b),&(f.c));
                            return 0;
                         }


$>./a.out
0022FF58 < 0022FF5C < 0022FF60

paumier@univ-mlv.fr                                      8
Alignement

●   adresse d'une structure = adresse de son
    premier champ
●   pour les autres champs, le compilateur
    fait de l'alignement pour avoir, selon
    l'implémentation:
    –   des adresses multiples de la taille des
        données
    –   des adresses multiples de la taille des
        pointeurs
    –   ...
paumier@univ-mlv.fr                               9
Alignement

●    taille variable suivant l'ordre des
     champs:
    struct to {                   struct ta {
       char a;                       int a;
       int b;                        char b;    sizeof(ta)=8
       char c;    sizeof(to)=12      char c;
       char d;                       char d;
    };                            };


●    ne jamais essayer de deviner l'adresse
     d'un champ ou la taille d'une structure:
      –   noms des champs
      –   sizeof
paumier@univ-mlv.fr                                      10
Alignement
struct to {                       struct ta {
   char a;                           int a;
   int b;                            char b;    sizeof(ta)=8
   char c;        sizeof(to)=12      char c;
   char d;                           char d;
};                                };


     @+0 a                           @+0
                                           a


     @+4                             @+4 b
                                     @+5 c
           b
                                     @+6 d

     @+8 c
     @+9 d




paumier@univ-mlv.fr                                       11
Initialisation

 ●   struct to t={val0,val1,...,valn-1};
                       struct to t={'a',145,'y','u'};


 ●   seulement lors de la déclaration
                                 int main(int argc,char* argv[]) {
                                    struct to t;
                                    t={'a',145,'y','u'};
                                    printf("%c %d %c %cn",t.a,t.b,t.c,t.d);
                                    return 0;
                                 }

$>gcc -Wall -ansi struct.c
struct.c: Dans la fonction « main »:
struct.c:33: erreur d'analyse syntaxique avant le jeton « { »

 paumier@univ-mlv.fr                                                     12
Opérations

●   l'affectation fonctionne
               int main(int argc,char* argv[]) {
                  struct to z={'a',145,'y','u'};
                  struct to t=z;
                  printf("%c %d %c %cn",t.a,t.b,t.c,t.d);
                  return 0;
               }


●   attention: si un champ est un pointeur,
    on ne copie que l'adresse
●   pas d'opérateur de comparaison
    ⇨ à écrire soi-même

paumier@univ-mlv.fr                                          13
Structures en paramètres

●   les structures sont passées par valeur!
    –   non modifiables
    –   peuvent occuper beaucoup de place sur la
        pile (tableaux)
    –   temps de recopie
●   toujours les passer par adresse




paumier@univ-mlv.fr                                14
Structures en paramètres


  struct array {                 struct array {
     int t[100000];                 int t[100000];
     int size;                      int size;
  };                             };

  void f(struct array a) {       void f(struct array* a) {
     int i;                         int i;
     for (i=0;i<a.size;i++) {       for (i=0;i<(*a).size;i++) {
        printf("%dn",a.t[i]);         printf("%dn",(*a).t[i]);
     }                              }
  }                              }




      attention au parenthésage: (*a).t[i] ≠ *a.t[i]



paumier@univ-mlv.fr                                                15
Structures en paramètres

●   passage d'adresse =
     –   gain de temps
     –   gain d'espace sur la pile
     –   on peut modifier la structure
●   notation simplifiée: (*a).size = a->size

    void f(struct array* a) {         void f(struct array* a) {
       int i;                            int i;
       for (i=0;i<(*a).size;i++) {       for (i=0;i<a->size;i++) {
          printf("%dn",(*a).t[i]);         printf("%dn",a->t[i]);
       }                                 }
    }                                 }



paumier@univ-mlv.fr                                                   16
Retourner une structure

●   on peut, mais c'est une opération de
    copie sur la pile
●   mêmes problèmes que pour le passage
    par valeur
●   à n'utiliser que très soigneusement
●   le plus souvent, il faudra utiliser de
    l'allocation dynamique



paumier@univ-mlv.fr                          17
Les unions
union toto {
                         zone mémoire que l'on
     type1 nom1;         peut voir soit comme un
     type2 nom2;         type1, soit comme un
     ...                 type2, etc.

     typeN nomN;
};
●   s'utilisent comme les     union toto {
                                 char a;
                                 float b;
    structures                };

                              void foo(union toto* t) {
                                 t->a='z';
                              }



paumier@univ-mlv.fr                                       18
Les unions

●   taille = taille du plus grand champ
●   au programmeur de savoir quel champ
    doit être utilisé
    union toto {
       char a;
       char s[16];
    };
                                        $>./a.out
    int main(int argc,char* argv[]) {   $oucou
       union toto t;
       strcpy(t.s,"coucou");
       t.a='$';
       printf("%sn",t.s);
       return 0;
    }



paumier@univ-mlv.fr                                 19
Les unions
●   utiles quand on doit manipuler des
    informations exclusives les unes des
    autres              union student {
                               char login[16]
                               int id;
                          };


●   peuvent être utilisées anonymement dans
    une structure
                       struct student {
                          char name[256];
                          union {
                             char login[16];
                             int id;
                          };
                       };


paumier@univ-mlv.fr                             20
Unions complexes

●   on peut mettre des structures
    (anonymes) dans les unions
               union color {
                  /* RGB representation */
                  struct {
                     unsigned char red,blue,green;
                  };
                  /* 2 colors: 0=black 1=white */
                  char BandW;
               };




    on peut utiliser soit red, blue et green, soit BandW


paumier@univ-mlv.fr                                        21
Quel(s) champ(s) utiliser ?

●   encapsulation dans une structure avec
    un champ d'information

                 struct color {
                    /* 0=RGB 1=black & white */
                    char type;
                    union {
                       /* RGB representation */
                       struct {
                          unsigned char red,blue,green;
                       };
                       /* 2 colors: 0=black 1=white */
                       char BandW;
                    };
                 };




paumier@univ-mlv.fr                                       22
Les énumérations

●   enum nom {id0,id1,...,idn-1};
●   si on a une variable de type enum nom,
    elle pourra prendre les valeurs idi

                 enum gender {male,female};

                 void init(enum gender *g,char c) {
                    *g=(c=='m')?male:female;
                 }




paumier@univ-mlv.fr                                   23
Les énumérations

●   valeurs de type int
●   par défaut, commencent à 0 et vont de 1
    en 1
●   on peut les modifier
                      enum color {
                         blue=45,
                         green, /* 46 */
                         red,   /* 47 */
                         yellow=87,
                         black /* 88 */
                      };




paumier@univ-mlv.fr                        24
Les énumérations

●   on peut avoir plusieurs fois la même
    valeur
                        enum color {
                           blue=45, BLUE=blue, Blue=blue,
                           green/* =46 */, GREEN=green, Green=green
                        };

                        int main(int argc,char* argv[]) {
                           printf("%d %d %d %d %d %dn",
                                  blue,BLUE,Blue,green,GREEN,Green);
                           return 0;
                        }




                                 $>./a.out
                                 45 45 45 46 46 46

paumier@univ-mlv.fr                                                    25
Contrôles des valeurs

●   contrairement aux espoirs du
    programmeur, pas de contrôle!

                  enum gender {male='m',female='f'};

                  enum color {blue,red,green};

                  int main(int argc,char* argv[]) {
                     enum gender g='z';
                     enum color c=g;
                     /* ... */
                     return 0;
                  }




paumier@univ-mlv.fr                                    26
Contrôles des valeurs

  ●   seul contrôle: avec -Wall, gcc indique s'il
      manque des cas dans un switch (quand il
      n'y a pas de default)
                                    enum color {blue,red,green,yellow};

                                    void foo(enum color c) {
                                       switch (c) {
                                          case blue: /* ... */ break;
                                          case red: /* ... */ break;
                                       }
$>gcc -Wall -ansi enum.c            }
enum.c: Dans la fonction « foo »:
enum.c:24: AVERTISSEMENT: valeur d'énumération « green » n'est pas
traitée dans le switch
enum.c:24: AVERTISSEMENT: valeur d'énumération « yellow » n'est pas
traitée dans le switch

  paumier@univ-mlv.fr                                               27
Déclaration de constantes

●   si on veut juste déclarer des constantes,
    on peut utiliser une énumération
    anonyme
    enum {Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};

    char* names[]={"Monday","Tuesday","Wednesday","Thursday","Friday",
                   "Saturday","Sunday"};

    void print_day(int day) {
       printf("%sn",names[day]);
    }

    int main(int argc,char* argv[]) {
       print_day(Saturday);
       return 0;
    }



paumier@univ-mlv.fr                                                      28
Combinaison union/enum

●   quand on utilise une union, c'est plus
    propre de décrire les alternatives avec
    une énumération:

            enum cell_type {EMPTY,BONUS,MALUS,PLAYER,MONSTER};

            struct cell {
               enum cell_type type;
               union {
                  Bonus bonus;
                  Malus malus;
                  Player player;
                  Monster monster;
               };
            };




paumier@univ-mlv.fr                                              29
typedef

●   typedef type nom;
●   permet de donner un nom à un type,
    simple ou composé
●   pratique pour éviter de recopier les
    mots-clés struct, union et enum

                 typedef signed char sbyte;
                 typedef unsigned char ubyte;

                 typedef struct cell Cell;
                 typedef enum color Color;



paumier@univ-mlv.fr                             30
typedef

●   pas de nouveaux types
●   seulement des synonymes
    interchangeables
                  struct array {
                     int t[N];
                     int size;
                  };

                  typedef struct array Array;

                  int main(int argc,char* argv[]) {
                     Array a;
                     struct array b=a;
                     /* ... */
                     return 0;
                  }


paumier@univ-mlv.fr                                   31
typedef

●   pour les types structurés, deux modes de
    définition:
enum cell_type {EMPTY,BONUS,MALUS,   typedef enum {EMPTY,BONUS,MALUS,
                PLAYER,MONSTER};             PLAYER,MONSTER} CellType;

typedef enum cell_type CellType;     typedef struct {
                                        CellType type;
struct cell {                           union {
   CellType type;                          Bonus bonus;
   union {                                 Malus malus;
      Bonus bonus;                         Player player;
      Malus malus;                         Monster monster;
      Player player;                    };
      Monster monster;               } Cell;
   };
};

typedef struct cell Cell;


paumier@univ-mlv.fr                                                 32
Les listes

●   application: coder une liste chaînée de
    noms de couleurs
●   utilisons une structure pour représenter
    une cellule de la liste:

                      #define COLOR_NAME_MAX 128

                      typedef struct {
                         char name[COLOR_NAME_MAX];
                         int next;
                      } ColorList;




paumier@univ-mlv.fr                                   33
Les listes
●   la mémoire est simulée par un tableau de
    telles structures:
              /* The cell array that represents memory */
              #define SIZE 1000
              extern ColorList memory[SIZE];


●   une cellule est caractérisée par son
    indice dans ce tableau
●   il faut une convention pour désigner
    l'absence de cellule en fin de liste:
                      /* The equivalent of NULL */
                      #define NOTHING -1
paumier@univ-mlv.fr                                         34
Les listes
●   pour gérer la mémoire, il faut savoir
    quelles cellules sont disponibles
●   astuce: utilisons une valeur spéciale pour
    le champ next

        /* A convention to indicate when a cell is not used */
        #define EMPTY_CELL -2




paumier@univ-mlv.fr                                              35
Les listes
●   il faut savoir allouer et désallouer:
    /**
      * Returns the index of the first free cell, or 'NOTHING' if there
      * is none.
      */
    int get_free_cell() {
         int i;
         for (i=0;i<SIZE;i++) {
            if (memory[i].next==EMPTY_CELL) return i;
         }
         return NOTHING;
    }


    /**
      * Marks the given memory cell as being free.
      */
    void free_cell(int index) {
         memory[index].next=EMPTY_CELL;
    }


paumier@univ-mlv.fr                                                       36
Les listes
●   on peut maintenant ajouter une couleur
    en tête de liste:

/**
  * Adds a cell representing the given color at the beginning of the given
  * list. Returns 1 in case of success, 0 if there is no more memory.
  */
int add_color(int *list,char* color) {
    int index=get_free_cell();
    if (index==NOTHING) {
       return 0;
    }
    strcpy(memory[index].name,color);
    memory[index].next=(*list);
    (*list)=index;
    return 1;
}




paumier@univ-mlv.fr                                                    37
Les listes
●   on veut pouvoir afficher la liste:


                /**
                  * Prints the given list.
                  */
                void print_list(int list) {
                     printf("list=");
                     while (list!=NOTHING) {
                        printf("%s ",memory[list].name);
                        list=memory[list].next;
                     }
                     printf("n");
                }




paumier@univ-mlv.fr                                        38
Les listes
●   enfin, il faut pouvoir libérer une liste
    entière:

                      /**
                        * Frees the whole given list.
                        */
                      void free_list(int list) {
                          int tmp;
                          while (list!=NOTHING) {
                             tmp=memory[list].next;
                             free_cell(list);
                             list=tmp;
                          }
                      }




paumier@univ-mlv.fr                                     39
Les listes
●   on peut maintenant tester notre
    bibliothèque:

    #include <stdio.h>
    #include "color_list.h"

    int main(int argc,char* argv[]) {
       init_memory();
       int list=NOTHING;
       add_color(&list,"blue");         $>./a.out
       add_color(&list,"black");
       add_color(&list,"red");
                                        list=red black blue
       print_list(list);
       free_list(list);
       return 0;
    }




paumier@univ-mlv.fr                                     40
Les listes
●   bug si on essaie d'afficher la liste après
    l'avoir libérée:

    #include <stdio.h>
    #include "color_list.h"
                                        $>./a.out
    int main(int argc,char* argv[]) {   list=red black   blue
       init_memory();
       int list=NOTHING;                list=blue blue   blue
       add_color(&list,"blue");
       add_color(&list,"black");
                                        blue blue blue   blue
       add_color(&list,"red");          blue blue blue   blue
       print_list(list);
       free_list(list);                 blue blue blue
       print_list(list);                blue...
       return 0;
    }



paumier@univ-mlv.fr                                       41
Les listes
●   normal: la condition d'arrêt de
    print_list est list==NOTHING, or on a
    mis la valeur EMPTY_CELL
●   solution: mettre list à NOTHING après
    l'appel à free_list

                      int main(int argc,char* argv[]) {
                         ...
                         free_list(list);
                         list=NOTHING;
                         print_list(list);
                         return 0;
                      }



paumier@univ-mlv.fr                                       42
Les listes
●   la fausse bonne idée: faire en sorte que
    free_list modifie son paramètre:

      /**
        * Frees the whole given list and sets '*list' to 'NOTHING'.
        */
      void free_list2(int *list) {
           int tmp;
           while (*list!=NOTHING) {
              tmp=memory[*list].next;
              free_cell(*list);
              *list=tmp;
           }
      }




paumier@univ-mlv.fr                                                   43
Les listes
●   pourquoi n'est-ce pas une bonne idée ?
●   parce qu'une même cellule peut être
    référencée plusieurs fois, et qu'on ne va
    mettre à jour qu'une seule référence:

int main(int argc,char* argv[]) {
                                    $>./a.out
   ...                              list=red black   blue
   print_list(list);
   int list2=list;
                                    list=
   free_list2(&list);               list=blue blue   blue
   print_list(list);
   print_list(list2);               blue blue blue   blue
   return 0;                        blue blue blue   blue
}
                                    blue...

paumier@univ-mlv.fr                                     44

Contenu connexe

Tendances

Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
 
Partie 12: Polymorphisme — Programmation orientée objet en C++
Partie 12: Polymorphisme — Programmation orientée objet en C++Partie 12: Polymorphisme — Programmation orientée objet en C++
Partie 12: Polymorphisme — Programmation orientée objet en C++Fabio Hernandez
 
Corrigé langage c
Corrigé langage cCorrigé langage c
Corrigé langage ccoursuniv
 
Cours langage c
Cours langage cCours langage c
Cours langage ccoursuniv
 
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++Fabio Hernandez
 
Cours de programmation en c
Cours de programmation en cCours de programmation en c
Cours de programmation en cbenouini rachid
 
Explication du micro
Explication du microExplication du micro
Explication du microlouminho
 
Partie 1: Notions de base — Programmation orientée objet en C++
Partie 1: Notions de base — Programmation orientée objet en C++Partie 1: Notions de base — Programmation orientée objet en C++
Partie 1: Notions de base — Programmation orientée objet en C++Fabio Hernandez
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)rezgui mohamed
 
Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++Fabio Hernandez
 
Langage C
Langage  CLangage  C
Langage Cjwilili
 
Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Fahad Golra
 
Seance 4- Programmation en langage C
Seance 4- Programmation en langage CSeance 4- Programmation en langage C
Seance 4- Programmation en langage CFahad Golra
 
Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++Fabio Hernandez
 
C++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelistC++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelistVincent Agnus
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Loic Yon
 

Tendances (20)

Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
Partie 12: Polymorphisme — Programmation orientée objet en C++
Partie 12: Polymorphisme — Programmation orientée objet en C++Partie 12: Polymorphisme — Programmation orientée objet en C++
Partie 12: Polymorphisme — Programmation orientée objet en C++
 
Corrigé langage c
Corrigé langage cCorrigé langage c
Corrigé langage c
 
Cours langage c
Cours langage cCours langage c
Cours langage c
 
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
 
Cours de programmation en c
Cours de programmation en cCours de programmation en c
Cours de programmation en c
 
Explication du micro
Explication du microExplication du micro
Explication du micro
 
Le langage C
Le langage CLe langage C
Le langage C
 
Partie 1: Notions de base — Programmation orientée objet en C++
Partie 1: Notions de base — Programmation orientée objet en C++Partie 1: Notions de base — Programmation orientée objet en C++
Partie 1: Notions de base — Programmation orientée objet en C++
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)
 
Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++
 
Langage C
Langage  CLangage  C
Langage C
 
Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Seance 3- Programmation en langage C
Seance 3- Programmation en langage C
 
Seance 4- Programmation en langage C
Seance 4- Programmation en langage CSeance 4- Programmation en langage C
Seance 4- Programmation en langage C
 
Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++
 
C++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelistC++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelist
 
Le langage C
Le langage CLe langage C
Le langage C
 
Chapitre2 prog dsplf3
Chapitre2 prog dsplf3Chapitre2 prog dsplf3
Chapitre2 prog dsplf3
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
 
Chap2fonctionscpp
Chap2fonctionscppChap2fonctionscpp
Chap2fonctionscpp
 

En vedette

Invitation à l'aventure Planète Sports
Invitation à l'aventure Planète Sports   Invitation à l'aventure Planète Sports
Invitation à l'aventure Planète Sports Fleure Marcelline N'Doua
 
L’esclavage
L’esclavageL’esclavage
L’esclavagenacarEOI
 
Présentation projets culture tunis 6 dec 2012
Présentation projets culture tunis 6 dec 2012Présentation projets culture tunis 6 dec 2012
Présentation projets culture tunis 6 dec 2012OrangeDeveloperCenter
 
Notice aprilobseques
Notice aprilobsequesNotice aprilobseques
Notice aprilobsequesADPAssurances
 
Smam Frais d'obsèques
Smam Frais d'obsèquesSmam Frais d'obsèques
Smam Frais d'obsèquesADPAssurances
 
New york odp
New york odpNew york odp
New york odpnacarEOI
 
Guillaume tell,
Guillaume tell,Guillaume tell,
Guillaume tell,nacarEOI
 
Video crececonduplo
Video crececonduploVideo crececonduplo
Video crececonduploDUPLOGRAFIC
 
Media traditionnels &amp; facebook graph insider social analytics octobre 2012
Media traditionnels &amp; facebook graph insider social analytics octobre 2012Media traditionnels &amp; facebook graph insider social analytics octobre 2012
Media traditionnels &amp; facebook graph insider social analytics octobre 2012Graph Insider
 
Cacti or pnp for Icinga Web
Cacti or pnp for Icinga WebCacti or pnp for Icinga Web
Cacti or pnp for Icinga WebWilfried Tiani
 

En vedette (20)

Revue de presse 12 13 selection
Revue de presse 12 13 selectionRevue de presse 12 13 selection
Revue de presse 12 13 selection
 
Invitation à l'aventure Planète Sports
Invitation à l'aventure Planète Sports   Invitation à l'aventure Planète Sports
Invitation à l'aventure Planète Sports
 
6-Cm9 14-15
6-Cm9 14-156-Cm9 14-15
6-Cm9 14-15
 
L’esclavage
L’esclavageL’esclavage
L’esclavage
 
A plus
A plusA plus
A plus
 
Présentation projets culture tunis 6 dec 2012
Présentation projets culture tunis 6 dec 2012Présentation projets culture tunis 6 dec 2012
Présentation projets culture tunis 6 dec 2012
 
Notice aprilobseques
Notice aprilobsequesNotice aprilobseques
Notice aprilobseques
 
Smam Frais d'obsèques
Smam Frais d'obsèquesSmam Frais d'obsèques
Smam Frais d'obsèques
 
3-Cm4 2011-2012
3-Cm4 2011-20123-Cm4 2011-2012
3-Cm4 2011-2012
 
New york odp
New york odpNew york odp
New york odp
 
Lideres tecnicos 5
Lideres  tecnicos 5Lideres  tecnicos 5
Lideres tecnicos 5
 
Legoupil Industrie
Legoupil IndustrieLegoupil Industrie
Legoupil Industrie
 
Guillaume tell,
Guillaume tell,Guillaume tell,
Guillaume tell,
 
Cbp plaquette-2011
Cbp plaquette-2011Cbp plaquette-2011
Cbp plaquette-2011
 
Video crececonduplo
Video crececonduploVideo crececonduplo
Video crececonduplo
 
Catalogue2013
Catalogue2013Catalogue2013
Catalogue2013
 
5-Cm16 13-14
5-Cm16 13-145-Cm16 13-14
5-Cm16 13-14
 
Media traditionnels &amp; facebook graph insider social analytics octobre 2012
Media traditionnels &amp; facebook graph insider social analytics octobre 2012Media traditionnels &amp; facebook graph insider social analytics octobre 2012
Media traditionnels &amp; facebook graph insider social analytics octobre 2012
 
Cacti or pnp for Icinga Web
Cacti or pnp for Icinga WebCacti or pnp for Icinga Web
Cacti or pnp for Icinga Web
 
4-Cm6 15-16
4-Cm6 15-164-Cm6 15-16
4-Cm6 15-16
 

Similaire à C5 types structures

System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07haythem_2015
 
cours lanagage c avec des exemples d'application
cours lanagage c avec des exemples d'applicationcours lanagage c avec des exemples d'application
cours lanagage c avec des exemples d'applicationkamalomari2
 
SdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireSdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireAlexandru Radovici
 
Chapitre 10 - Les chaines de characteres.pdf
Chapitre 10 - Les chaines de characteres.pdfChapitre 10 - Les chaines de characteres.pdf
Chapitre 10 - Les chaines de characteres.pdfShiniGami0o0
 
Cours C Avancé chapitre 2 et chapitre.pdf
Cours C Avancé  chapitre 2 et chapitre.pdfCours C Avancé  chapitre 2 et chapitre.pdf
Cours C Avancé chapitre 2 et chapitre.pdfc79024186
 
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSiratiSoufiane
 
Lect14 dev2
Lect14 dev2Lect14 dev2
Lect14 dev2moisko
 
02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSSAyoubElmrabet6
 
ch7_les chaines de caractères.pdf
ch7_les chaines de caractères.pdfch7_les chaines de caractères.pdf
ch7_les chaines de caractères.pdfFadouaBouafifSamoud
 
Interception de signal avec dump de la pile d'appel
Interception de signal avec dump de la pile d'appelInterception de signal avec dump de la pile d'appel
Interception de signal avec dump de la pile d'appelThierry Gayet
 
Seance 1 - Programmation en langage C
Seance 1 - Programmation en langage CSeance 1 - Programmation en langage C
Seance 1 - Programmation en langage CFahad Golra
 
Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Rahma Boufalgha
 
Chap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdfChap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdframadanmahdi
 

Similaire à C5 types structures (20)

System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07
 
cours lanagage c avec des exemples d'application
cours lanagage c avec des exemples d'applicationcours lanagage c avec des exemples d'application
cours lanagage c avec des exemples d'application
 
SdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireSdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoire
 
Chapitre 10 - Les chaines de characteres.pdf
Chapitre 10 - Les chaines de characteres.pdfChapitre 10 - Les chaines de characteres.pdf
Chapitre 10 - Les chaines de characteres.pdf
 
Cours C Avancé chapitre 2 et chapitre.pdf
Cours C Avancé  chapitre 2 et chapitre.pdfCours C Avancé  chapitre 2 et chapitre.pdf
Cours C Avancé chapitre 2 et chapitre.pdf
 
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
 
Lect14 dev2
Lect14 dev2Lect14 dev2
Lect14 dev2
 
02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSS
 
Language-C.ppt
Language-C.pptLanguage-C.ppt
Language-C.ppt
 
ch7_les chaines de caractères.pdf
ch7_les chaines de caractères.pdfch7_les chaines de caractères.pdf
ch7_les chaines de caractères.pdf
 
Part1
Part1Part1
Part1
 
Memo java
Memo javaMemo java
Memo java
 
Interception de signal avec dump de la pile d'appel
Interception de signal avec dump de la pile d'appelInterception de signal avec dump de la pile d'appel
Interception de signal avec dump de la pile d'appel
 
C++ 11/14
C++ 11/14C++ 11/14
C++ 11/14
 
Seance 1 - Programmation en langage C
Seance 1 - Programmation en langage CSeance 1 - Programmation en langage C
Seance 1 - Programmation en langage C
 
Pensez objets avec java
Pensez objets avec javaPensez objets avec java
Pensez objets avec java
 
Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02
 
Chap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdfChap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdf
 
C++11
C++11C++11
C++11
 
POO-chapitre2.pptx
POO-chapitre2.pptxPOO-chapitre2.pptx
POO-chapitre2.pptx
 

C5 types structures

  • 1. Cours de C Types structurés Sébastien Paumier paumier@univ-mlv.fr Illustrations provenant du site http://tux.crystalxp.net/ 1
  • 2. Les structures ● objets regroupant plusieurs données appelées "champs" ● à définir hors d'une fonction ● définition: struct nom { type_champ1 nom_champ1; type_champ2 nom_champ2; ... }; paumier@univ-mlv.fr 2
  • 3. Les structures ● déclaration d'une variable: struct nom_type nom_var; ● accès aux champs: nom_var.nom_champ struct complex { double real; double imaginary; }; int main(int argc,char* argv[]) { struct complex c; c.real=1.2; c.imaginary=6.3; printf("%f+%f*in",c.real,c.imaginary); return 0; } paumier@univ-mlv.fr 3
  • 4. Choix des champs ● on peut mettre tout ce dont le compilateur connaît la taille ● on ne peut donc pas mettre la structure elle-même: struct list { int value; struct list next; }; $>gcc -Wall -ansi struct.c struct.c:7: champ « next » a un type incomplet paumier@univ-mlv.fr 4
  • 5. Structures récursives ● mais on peut mettre un pointeur sur la structure, car la taille des pointeurs est connue: struct list { int value; struct list* next; }; paumier@univ-mlv.fr 5
  • 6. Imbrication de structures ● un champ peut être une structure: struct id { char firstname[MAX]; char lastname[MAX]; }; struct people { pas d'ambiguïté car le struct id id; type ne s'appelle pas int age; }; id mais struct id int main(int argc,char* argv[]) { struct people p; strcpy(p.id.firstname,"Master"); strcpy(p.id.lastname,"Yoda"); p.age=943; /* ... */ return 0; } paumier@univ-mlv.fr 6
  • 7. Imbrication de structures ● 2 structures peuvent s'appeler l'une l'autre, à condition d'utiliser des pointeurs: struct state { struct transition* t; char final; }; struct transition { char letter; struct state* dest; struct transition* next; }; paumier@univ-mlv.fr 7
  • 8. Contraintes sur les structures ● champs organisés dans l'ordre de leur déclarations: struct foo { int a; char b; float c; }; int main(int argc,char* argv[]) { struct foo f; printf("%p < %p < %pn", &(f.a),&(f.b),&(f.c)); return 0; } $>./a.out 0022FF58 < 0022FF5C < 0022FF60 paumier@univ-mlv.fr 8
  • 9. Alignement ● adresse d'une structure = adresse de son premier champ ● pour les autres champs, le compilateur fait de l'alignement pour avoir, selon l'implémentation: – des adresses multiples de la taille des données – des adresses multiples de la taille des pointeurs – ... paumier@univ-mlv.fr 9
  • 10. Alignement ● taille variable suivant l'ordre des champs: struct to { struct ta { char a; int a; int b; char b; sizeof(ta)=8 char c; sizeof(to)=12 char c; char d; char d; }; }; ● ne jamais essayer de deviner l'adresse d'un champ ou la taille d'une structure: – noms des champs – sizeof paumier@univ-mlv.fr 10
  • 11. Alignement struct to { struct ta { char a; int a; int b; char b; sizeof(ta)=8 char c; sizeof(to)=12 char c; char d; char d; }; }; @+0 a @+0 a @+4 @+4 b @+5 c b @+6 d @+8 c @+9 d paumier@univ-mlv.fr 11
  • 12. Initialisation ● struct to t={val0,val1,...,valn-1}; struct to t={'a',145,'y','u'}; ● seulement lors de la déclaration int main(int argc,char* argv[]) { struct to t; t={'a',145,'y','u'}; printf("%c %d %c %cn",t.a,t.b,t.c,t.d); return 0; } $>gcc -Wall -ansi struct.c struct.c: Dans la fonction « main »: struct.c:33: erreur d'analyse syntaxique avant le jeton « { » paumier@univ-mlv.fr 12
  • 13. Opérations ● l'affectation fonctionne int main(int argc,char* argv[]) { struct to z={'a',145,'y','u'}; struct to t=z; printf("%c %d %c %cn",t.a,t.b,t.c,t.d); return 0; } ● attention: si un champ est un pointeur, on ne copie que l'adresse ● pas d'opérateur de comparaison ⇨ à écrire soi-même paumier@univ-mlv.fr 13
  • 14. Structures en paramètres ● les structures sont passées par valeur! – non modifiables – peuvent occuper beaucoup de place sur la pile (tableaux) – temps de recopie ● toujours les passer par adresse paumier@univ-mlv.fr 14
  • 15. Structures en paramètres struct array { struct array { int t[100000]; int t[100000]; int size; int size; }; }; void f(struct array a) { void f(struct array* a) { int i; int i; for (i=0;i<a.size;i++) { for (i=0;i<(*a).size;i++) { printf("%dn",a.t[i]); printf("%dn",(*a).t[i]); } } } } attention au parenthésage: (*a).t[i] ≠ *a.t[i] paumier@univ-mlv.fr 15
  • 16. Structures en paramètres ● passage d'adresse = – gain de temps – gain d'espace sur la pile – on peut modifier la structure ● notation simplifiée: (*a).size = a->size void f(struct array* a) { void f(struct array* a) { int i; int i; for (i=0;i<(*a).size;i++) { for (i=0;i<a->size;i++) { printf("%dn",(*a).t[i]); printf("%dn",a->t[i]); } } } } paumier@univ-mlv.fr 16
  • 17. Retourner une structure ● on peut, mais c'est une opération de copie sur la pile ● mêmes problèmes que pour le passage par valeur ● à n'utiliser que très soigneusement ● le plus souvent, il faudra utiliser de l'allocation dynamique paumier@univ-mlv.fr 17
  • 18. Les unions union toto { zone mémoire que l'on type1 nom1; peut voir soit comme un type2 nom2; type1, soit comme un ... type2, etc. typeN nomN; }; ● s'utilisent comme les union toto { char a; float b; structures }; void foo(union toto* t) { t->a='z'; } paumier@univ-mlv.fr 18
  • 19. Les unions ● taille = taille du plus grand champ ● au programmeur de savoir quel champ doit être utilisé union toto { char a; char s[16]; }; $>./a.out int main(int argc,char* argv[]) { $oucou union toto t; strcpy(t.s,"coucou"); t.a='$'; printf("%sn",t.s); return 0; } paumier@univ-mlv.fr 19
  • 20. Les unions ● utiles quand on doit manipuler des informations exclusives les unes des autres union student { char login[16] int id; }; ● peuvent être utilisées anonymement dans une structure struct student { char name[256]; union { char login[16]; int id; }; }; paumier@univ-mlv.fr 20
  • 21. Unions complexes ● on peut mettre des structures (anonymes) dans les unions union color { /* RGB representation */ struct { unsigned char red,blue,green; }; /* 2 colors: 0=black 1=white */ char BandW; }; on peut utiliser soit red, blue et green, soit BandW paumier@univ-mlv.fr 21
  • 22. Quel(s) champ(s) utiliser ? ● encapsulation dans une structure avec un champ d'information struct color { /* 0=RGB 1=black & white */ char type; union { /* RGB representation */ struct { unsigned char red,blue,green; }; /* 2 colors: 0=black 1=white */ char BandW; }; }; paumier@univ-mlv.fr 22
  • 23. Les énumérations ● enum nom {id0,id1,...,idn-1}; ● si on a une variable de type enum nom, elle pourra prendre les valeurs idi enum gender {male,female}; void init(enum gender *g,char c) { *g=(c=='m')?male:female; } paumier@univ-mlv.fr 23
  • 24. Les énumérations ● valeurs de type int ● par défaut, commencent à 0 et vont de 1 en 1 ● on peut les modifier enum color { blue=45, green, /* 46 */ red, /* 47 */ yellow=87, black /* 88 */ }; paumier@univ-mlv.fr 24
  • 25. Les énumérations ● on peut avoir plusieurs fois la même valeur enum color { blue=45, BLUE=blue, Blue=blue, green/* =46 */, GREEN=green, Green=green }; int main(int argc,char* argv[]) { printf("%d %d %d %d %d %dn", blue,BLUE,Blue,green,GREEN,Green); return 0; } $>./a.out 45 45 45 46 46 46 paumier@univ-mlv.fr 25
  • 26. Contrôles des valeurs ● contrairement aux espoirs du programmeur, pas de contrôle! enum gender {male='m',female='f'}; enum color {blue,red,green}; int main(int argc,char* argv[]) { enum gender g='z'; enum color c=g; /* ... */ return 0; } paumier@univ-mlv.fr 26
  • 27. Contrôles des valeurs ● seul contrôle: avec -Wall, gcc indique s'il manque des cas dans un switch (quand il n'y a pas de default) enum color {blue,red,green,yellow}; void foo(enum color c) { switch (c) { case blue: /* ... */ break; case red: /* ... */ break; } $>gcc -Wall -ansi enum.c } enum.c: Dans la fonction « foo »: enum.c:24: AVERTISSEMENT: valeur d'énumération « green » n'est pas traitée dans le switch enum.c:24: AVERTISSEMENT: valeur d'énumération « yellow » n'est pas traitée dans le switch paumier@univ-mlv.fr 27
  • 28. Déclaration de constantes ● si on veut juste déclarer des constantes, on peut utiliser une énumération anonyme enum {Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday}; char* names[]={"Monday","Tuesday","Wednesday","Thursday","Friday", "Saturday","Sunday"}; void print_day(int day) { printf("%sn",names[day]); } int main(int argc,char* argv[]) { print_day(Saturday); return 0; } paumier@univ-mlv.fr 28
  • 29. Combinaison union/enum ● quand on utilise une union, c'est plus propre de décrire les alternatives avec une énumération: enum cell_type {EMPTY,BONUS,MALUS,PLAYER,MONSTER}; struct cell { enum cell_type type; union { Bonus bonus; Malus malus; Player player; Monster monster; }; }; paumier@univ-mlv.fr 29
  • 30. typedef ● typedef type nom; ● permet de donner un nom à un type, simple ou composé ● pratique pour éviter de recopier les mots-clés struct, union et enum typedef signed char sbyte; typedef unsigned char ubyte; typedef struct cell Cell; typedef enum color Color; paumier@univ-mlv.fr 30
  • 31. typedef ● pas de nouveaux types ● seulement des synonymes interchangeables struct array { int t[N]; int size; }; typedef struct array Array; int main(int argc,char* argv[]) { Array a; struct array b=a; /* ... */ return 0; } paumier@univ-mlv.fr 31
  • 32. typedef ● pour les types structurés, deux modes de définition: enum cell_type {EMPTY,BONUS,MALUS, typedef enum {EMPTY,BONUS,MALUS, PLAYER,MONSTER}; PLAYER,MONSTER} CellType; typedef enum cell_type CellType; typedef struct { CellType type; struct cell { union { CellType type; Bonus bonus; union { Malus malus; Bonus bonus; Player player; Malus malus; Monster monster; Player player; }; Monster monster; } Cell; }; }; typedef struct cell Cell; paumier@univ-mlv.fr 32
  • 33. Les listes ● application: coder une liste chaînée de noms de couleurs ● utilisons une structure pour représenter une cellule de la liste: #define COLOR_NAME_MAX 128 typedef struct { char name[COLOR_NAME_MAX]; int next; } ColorList; paumier@univ-mlv.fr 33
  • 34. Les listes ● la mémoire est simulée par un tableau de telles structures: /* The cell array that represents memory */ #define SIZE 1000 extern ColorList memory[SIZE]; ● une cellule est caractérisée par son indice dans ce tableau ● il faut une convention pour désigner l'absence de cellule en fin de liste: /* The equivalent of NULL */ #define NOTHING -1 paumier@univ-mlv.fr 34
  • 35. Les listes ● pour gérer la mémoire, il faut savoir quelles cellules sont disponibles ● astuce: utilisons une valeur spéciale pour le champ next /* A convention to indicate when a cell is not used */ #define EMPTY_CELL -2 paumier@univ-mlv.fr 35
  • 36. Les listes ● il faut savoir allouer et désallouer: /** * Returns the index of the first free cell, or 'NOTHING' if there * is none. */ int get_free_cell() { int i; for (i=0;i<SIZE;i++) { if (memory[i].next==EMPTY_CELL) return i; } return NOTHING; } /** * Marks the given memory cell as being free. */ void free_cell(int index) { memory[index].next=EMPTY_CELL; } paumier@univ-mlv.fr 36
  • 37. Les listes ● on peut maintenant ajouter une couleur en tête de liste: /** * Adds a cell representing the given color at the beginning of the given * list. Returns 1 in case of success, 0 if there is no more memory. */ int add_color(int *list,char* color) { int index=get_free_cell(); if (index==NOTHING) { return 0; } strcpy(memory[index].name,color); memory[index].next=(*list); (*list)=index; return 1; } paumier@univ-mlv.fr 37
  • 38. Les listes ● on veut pouvoir afficher la liste: /** * Prints the given list. */ void print_list(int list) { printf("list="); while (list!=NOTHING) { printf("%s ",memory[list].name); list=memory[list].next; } printf("n"); } paumier@univ-mlv.fr 38
  • 39. Les listes ● enfin, il faut pouvoir libérer une liste entière: /** * Frees the whole given list. */ void free_list(int list) { int tmp; while (list!=NOTHING) { tmp=memory[list].next; free_cell(list); list=tmp; } } paumier@univ-mlv.fr 39
  • 40. Les listes ● on peut maintenant tester notre bibliothèque: #include <stdio.h> #include "color_list.h" int main(int argc,char* argv[]) { init_memory(); int list=NOTHING; add_color(&list,"blue"); $>./a.out add_color(&list,"black"); add_color(&list,"red"); list=red black blue print_list(list); free_list(list); return 0; } paumier@univ-mlv.fr 40
  • 41. Les listes ● bug si on essaie d'afficher la liste après l'avoir libérée: #include <stdio.h> #include "color_list.h" $>./a.out int main(int argc,char* argv[]) { list=red black blue init_memory(); int list=NOTHING; list=blue blue blue add_color(&list,"blue"); add_color(&list,"black"); blue blue blue blue add_color(&list,"red"); blue blue blue blue print_list(list); free_list(list); blue blue blue print_list(list); blue... return 0; } paumier@univ-mlv.fr 41
  • 42. Les listes ● normal: la condition d'arrêt de print_list est list==NOTHING, or on a mis la valeur EMPTY_CELL ● solution: mettre list à NOTHING après l'appel à free_list int main(int argc,char* argv[]) { ... free_list(list); list=NOTHING; print_list(list); return 0; } paumier@univ-mlv.fr 42
  • 43. Les listes ● la fausse bonne idée: faire en sorte que free_list modifie son paramètre: /** * Frees the whole given list and sets '*list' to 'NOTHING'. */ void free_list2(int *list) { int tmp; while (*list!=NOTHING) { tmp=memory[*list].next; free_cell(*list); *list=tmp; } } paumier@univ-mlv.fr 43
  • 44. Les listes ● pourquoi n'est-ce pas une bonne idée ? ● parce qu'une même cellule peut être référencée plusieurs fois, et qu'on ne va mettre à jour qu'une seule référence: int main(int argc,char* argv[]) { $>./a.out ... list=red black blue print_list(list); int list2=list; list= free_list2(&list); list=blue blue blue print_list(list); print_list(list2); blue blue blue blue return 0; blue blue blue blue } blue... paumier@univ-mlv.fr 44