Vous êtes sur la page 1sur 36

Structures

Synonymes
Unions

Partie 2 : Nouveaux types


et synonymes
Structures
Synonymes
Unions

Sommaire

1 Structures

2 Synonymes

3 Unions
Structures
Synonymes
Unions

Sommaire

1 Structures

2 Synonymes

3 Unions
Structures
Synonymes
Unions

Introduction

Types de base du C
I int, float, char
I les tableaux statiques
I les pointeurs sur ces types
Nouveau types ? ?
I une personne : un nom, un âge, un numéro de téléphone
I une date : jour, un mois, une année
I et les tableaux ? ?

types composés, enregistrements ou structures

Les éléments d’un enregistrement sont appelés des champs


Structures
Synonymes
Unions

Définition

Une structure est un nouveau type de données constitué par


un ensemble de variables (champs) qui peuvent être
hétérogènes et de types différents

La différence avec le type tableau est que les champs d’un


tableau sont tous homogènes et du même type

Les structures permettent de représenter des objets réels


caractérisées par plusieurs informations, par exemple :
I Une personne caractérisée par son nom (chaîne), son âge
(entier), sa taille (réel),...
I Une voiture caractérisée par sa marque (chaîne), sa couleur
(chaîne), son année modèle(entier),...
Structures
Synonymes
Unions

Déclaration d’une structure

La déclaration d’une structure s’effectue en précisant le nom


de la structure, ainsi que le nom et le type de ses champs :
struct nom_structure
{ type 1 nom_champ1 ;
type 2 nom_champ2 ;
type N nom_champN ;} ;
Exemple
struct Personne
{char Nom[20];
int Age;
float taille;};

Rq : Le nom d’une structure n’est pas un nom de variable, c’est le


nom du type ou modèle de la structure
Structures
Synonymes
Unions

Déclaration d’une variable structure


La déclaration d’une structure ne réserve pas d’espace
mémoire
La réservation se fait quand on définit des variables
correspondant à ce modèle de structure. Ceci peut se faire
soit :
I après la déclaration de la structure, par exemple : struct

Personne p1, tab[10] ;


I ou au moment de la déclaration de la structure

struct Personne
{
char Nom[20]; //
int Age;
float taille;
}p1,tab[10];//tab est une variable de type tableau de 10 elements
// (de type Personne)
Structures
Synonymes
Unions

Initialisation d’une structure

Lors de la déclaration d’une variable structure, on peut


initialiser ses champs avec une notation semblable à celle
utilisée pour les tableaux en indiquant la liste des valeurs
respectives entre accolades.
Exemple

struct date
{
unsigned short jour;
char mois[10];
unsigned short annee;
};
struct date d1= {15,"Novembre", 2013};
Structures
Synonymes
Unions

Accès aux champs d’une structure


L’accès à un champ d’une variable structure se fait par le nom
de la variable suivi d’un point et du nom du champ

nom_variable.nom_champ

L’élément ainsi désigné est équivalent à une variable de même


type que le champ auquel on accède
Exemple 1

struct personne P;
P.nom="Alami";
P.prenom="Ahmed";
P.age=20;
printf ("Cette personne s’appelle %s %s et a %d ans", P.nom ,
P.prenom , P.age);
Structures
Synonymes
Unions

Exemple de saisie et affichage d’une structure


Soit la structure article définie par :

struct article{
int numero; //un numero qui identifie l’article
char nom[20];
int qte_stock; // quantite disponible en stock
float prix;
};

Soit la déclaration de variables :


struct article art ;

Exercice :
Saisissez les champs de la structure art, puis affichez son
contenu
Structures
Synonymes
Unions

Exemple de saisie et d’affichage d’une structure

Saisie
printf ("Entrez respectivement les champs de l’article ");
scanf("%d %s %d %f",&art.numero,art.nom,&art.qte_stock,&art.prix);

Affichage

printf ("Cet article a pour :");


printf (" numero : %d ",art.numero);
printf (" nom : %s ",art.nom);
printf (" quantite en stock : %d ",art.qte_stock);
printf (" prix : %f ",art.prix);
Structures
Synonymes
Unions

Alignement en mémoire
Structures
Synonymes
Unions

Alignement en mémoire des variables d’un type structuré


Structures
Synonymes
Unions

Alignement en mémoire des variables d’un type structuré


Structures
Synonymes
Unions

Octets de complétion (padding)


Structures
Synonymes
Unions

Structures et pointeur
Dans le cas d’une variable structure de type pointeur, on
utilise en général l’opérateur -> pour accéder aux champs
nom_variable ->nom_champ

Exemple

date d;
date *pd= &d;
pd->jour=2; // ou bien (*pd).jour (les parentheses sont ici
// indispensables)

Exercice :
refaites la saisie et l’affichage en utilisant le pointeur pt_art
Remarque :
il faut d’abord initialiser le pointeur pt_art
Structures
Synonymes
Unions

Exemple de Saisie et d’affichage via un pointeur

Saisie
struct article art,*pt_art;
pt_art=&art;
printf ("Entrez respectivement les champs de l’article ");
scanf("%d %s %d %f",&pt_art ->numero,pt_art ->nom,
&pt_art ->qte_stock,&pt_art ->prix);

Affichage

printf (" Cet article a pour : ");


printf (" numero : %d", pt_art ->numero);
printf ("nom : %s",pt_art ->nom);
printf ("quantite en stock : %d",pt_art->qte_stock);
printf ("prix : %f", pt_art ->prix);
Structures
Synonymes
Unions

Composition des structures

Les structures peuvent être composées de champs de n’importe


quel type connu : types de base, pointeur, tableau ou structure.
Des congés
Une date
typedef struct{
typedef struct { date debut;
int jour; date fin;
int mois; char nom [100];
int annee; }conge;
}date ; struct conge C;
C.debut.annee = 2009;

Remarque :
struct conge conges[50] ;
Structures
Synonymes
Unions

Manipulation des structures

struct Etudiant E1,E2;


E2=E1; // est une instruction valide qui recopie
// tous les champs de E1 dans les champs de E2
if(E1==E2) ou if(E1!=E2) // ne sont pas permises (Il n’est pas
// possible de comparer deux structures)
struct Personne p1, *p2; // L’operateur & permet
p2=&p1; //de recuperer l’adresse d’une variable structure

sizeof (struct Personne) ou sizeof (p1) // l’operateur sizeof


// permet de recuperer la taille d’un type structure ou
// d’une variable structure
Structures
Synonymes
Unions

Structures récursives

Une structure est dite récursive si elle contient des pointeurs


vers elle même, par exemple
Example
struct Individu
{
char *Nom;
int Age;
struct Individu *Pere, *Mere;
};

Ce genre de structures est fondamental en programmation car


il permet d’implémenter la plupart des structures de données
employées en informatique (seront étudiées en cours de
Structures de données)
Structures
Synonymes
Unions

Sommaire

1 Structures

2 Synonymes

3 Unions
Structures
Synonymes
Unions

Définition de types synonymes : typedef


En C, on peut définir des types nouveaux synonymes de types
existants (simples, pointeur, tableau, structure,...) en utilisant
le mot clé typedef. Ces nouveaux types peuvent être utilisées
ensuite comme les types prédéfinis
Exemple d’un type synonyme d’un type simple :
typedef int entier ; définit un nouveau type appelé entier
synonyme du type prédéfini int
entier i=4,T[10] ; le type entier est utilisé ici pour déclarer des
variables
I Remarque : l’intérêt de typedef pour les types de base est
limité puisqu’il remplace simplement un nom par un autre
Exemple d’un type synonyme d’un type pointeur :
typedef int * ptr_ entier ;
ptr_ entier p1,p2 ; p1 et p2 sont des pointeurs sur des int
typedef char* chaine ;
chaine ch ;
Structures
Synonymes
Unions

Exemples de typedef
Type synonyme d’un type tableau :
typedef float tableau[10];
tableau T; // T est un tableau de 10 reels
typedef int matrice[4][5];
matrice A; // A est une matrice d’entiers de 4 lignes et 5 colonnes

Type synonyme d’un type structure :


typedef struct
{int jour;
int mois;
int annee;
}date;

I date est le nom du nouveau type et non d’une variable


I On peut utiliser directement ce type, par exemple : date d, *p ;
I Ceci permet simplement d’éviter l’emploi du mot clé struct
Structures
Synonymes
Unions

Fonctions et structures

Transmission d’une structure en paramètre


I En C, on peut faire la transmission d’une structure en
argument d’une fonction, que ça soit par valeur ou par adresse.

I Il s’agit simplement d’appliquer ce que nous connaissons déjà


(avec les types de base :int, char,...).
I La seule différence entre les deux modes de passage est
l’opérateur d’accès aux champs de la structure

"." pour un passage par valeur

"->" pour un passage par adresse


Structures
Synonymes
Unions

Fonctions et structures
Exemple 1

#include <stdio.h>
typedef struct {
int a ;
float b ;
}enreg;
void fct (enreg s)
{
s.a = 0; s.b=1;
printf ("dans fct : %d %f", s.a, s.b);
}
main(){
enreg x ;
x.a = 1; x.b = 12.5;
printf ("avant appel fct : %d %f",x.a,x.b);
fct (x) ;
printf ("au retour dans main : %d %f", x.a, x.b);
}
Structures
Synonymes
Unions

Fonctions et structures
Exemple 2

#include <stdio.h>
typedef struct{
int a;
float b;
}enreg;
void fct (enreg * ads)
{
ads->a = 0 ; ads->b = 1;
printf ("dans fct : %d %f", ads->a, ads->b);
}
main(){
enreg x;
x.a = 1; x.b = 12.5;
printf ("avant appel fct : %d %f",x.a,x.b);
fct (&x);
printf ("au retour dans main : %d %f", x.a, x.b);
}
Structures
Synonymes
Unions

Fonctions et structures
Retour d’une structure
I En C, on peut réaliser des fonctions qui fournissent en retour
la valeur d’une structure

enreg renvoiEnreg(...)
{ struct enreg s ; /* structure locale a fct */
.....
return s ; /* dont la fonction renvoie la valeur */
}

I Notez bien que s aura dû soit être créée localement par la


fonction, soit éventuellement reçue en argument
I En C, il est possible de réaliser une fonction qui renvoie comme
résultat un pointeur sur une structure.
I La structure, dans le dernier cas, ne peut plus être locale à la
fonction
Structures
Synonymes
Unions

Sommaire

1 Structures

2 Synonymes

3 Unions
Structures
Synonymes
Unions

Définition & déclaration


Une union est un objet défini par un ensemble de données
(comme une structure) mais qui ne peut prendre qu’une seule
donnée à la fois à un instant donné
Une union se déclare comme une structure :

union nom_union
{type1 nom_champ1;
type2 nom_champ2;
...
typeN nom_champN;
};

Lorsque l’on définit une variable correspondant à un type


union, le compilateur réserve l’espace mémoire nécessaire pour
stocker le champ de plus grande taille appartenant à l’union
Structures
Synonymes
Unions

Exemple 1

typedef union
{
int entier;
float reel;
char carac;
}valeur;
valeur a;

Une variable de type valeur peut être considérée comme un


int, un float ou un char.
La syntaxe d’accès aux champs d’une union est identique à
celle pour accéder aux champs d’une structure
De façon générale, une union se manipule comme une structure
Structures
Synonymes
Unions

Exemple

a.entier;
a.reel;
a.carac;

Les unions permettent d’utiliser un même espace mémoire


pour des données de types différents à des moments différents
Les différents "champs" d’une union sont à la même adresse
physique
Remarques

&a.entier == (int*)&a.reel
&a.entier == (int*)&a.carac

Ces égalités sont vraies


Structures
Synonymes
Unions

Exemple 2

typedef struct
{
float abscisse ;
float ordonnee ;
}cartesien ;
typedef struct
{
float r;
double theta ;
}polaire;
typedef union
{
cartesien cart ;
polaire pol;
}coord;
coord c;
...
Structures
Synonymes
Unions

Définition & déclaration


Un type énuméré permet de définir d’une façon élégante un
type qui ne prend des valeurs que dans un ensemble précis de
valeurs constantes.
Déclaration
enum nom_de_enumeration{
enumerateur1,
enumerateur2,
enumerateurN
};

I Les énumérations servent à offrir des possibilités de gestion de


constantes énumérées
I Les énumérations permettent d’exprimer des valeurs
constantes de type entier en associant ces valeurs à des noms.
I Les énumérations offrent une alternative à l’utilisation du
pré-processeur dans la description de constantes
Structures
Synonymes
Unions

Exemples
Remarques
Les valeurs associées aux énumérateurs sont, par défaut,
définies de la manière suivante : la première constante est
associée à la valeur 0, les constantes suivantes suivent une
progression de 1.
Il est possible de fixer une valeur à chaque énumérateur en
faisant suivre l’énumérateur du signe égal et de la valeur
entière exprimée par une constante ; si l’énumérateur suivant
n’est pas associé à une valeur, la progression de 1 reprend à la
valeur courante

enum couleurs{
rouge,vert,bleu // rouge correspond a la valeur 0,
}rvb; // vert a 1 et bleu a 2
Structures
Synonymes
Unions

Exemples

Exemple 2

enum jour
{Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche};
enum jour j1, j2, j ;

Utilisation : les énumérateurs peuvent être utilisés dans des


expressions du langage à la même place que des constantes du
type entier
I calculs, tests, affectation ...
Structures
Synonymes
Unions

Opérations sur les variables de type énuméré


Affectation

j1 = Lundi ;
j2 = j1 ;

Comparaison

if (j == Lundi) printf("Le jour est un Lundi\n") ;

Incrémentation, décrémentation

j2 = Dimanche ; j2-- ;
for (j = Lundi ; j<Samedi ; j++)

Vous aimerez peut-être aussi