Vous êtes sur la page 1sur 6

L1 Informatique Universit Paris 8 - 2010-2011

Programmation Imprative I
Rim Chaabane rchaabane@ai.univ-paris8.fr

- Cours 5 -

Les types structures et les pointeurs


1. Les types structures
Les objets de type structure est comme un tableau, constitu de la runion dun ensemble de
valeurs. Mais la diffrence des tableaux, ces valeurs ne sont pas ncessairement de mme type.
Laccs une valeur de la structure ne se fait pas avec laide dindice, mais grce son nom.
Le type structure permet de rassembler des informations sous une type que vous aurez cr. Par
exemple vous crez le type Personne qui possde un nom, un prnom et un ge. Ou bien un type
Point qui a une abscisse x et une ordonne y.

1.1. Dclaration de structure


Pour dfinir un type structure personne, compose de trois champs : nom, prenom et age, il suffit
dcrire les instructions suivantes :
/* dfinition du type struct personne */
struct personne {
char nom[20], prenom[15];
int age ;
} ;

Attention : le point-virgule est ncessaire aprs l'accolade fermante de la dclaration de la


structure.
- Personne est le nom du type cr
- Nom, prenom et age sont les champs de ce type
Nous utilisons ensuite ce type pour dclarer des variables :
/*dclaration de variables mere et pre de type struct personne */
struct personne mere;
struct personne pere;
/* dfinition du type struct point */
struct point { float x, y ;
} ;

- point est le nom du type cr


- x et y sont les champs de ce type
/*dclaration de variables A et B de type struct point */
struct point A ;
struct point B ;

L1 Informatique Universit Paris 8 - 2010-2011


Programmation Imprative I
Rim Chaabane rchaabane@ai.univ-paris8.fr

- Cours 5 -

La dfinition dun type structure ne peut tre prcd du mot cl const. Il faut considrer la
dfinition dun type struct comme si vous dfinissez un nouveau type en C. Tout type en C ne
peut tre constant. Par contre une donne dun type quelconque peut tre dclare comme
constante. Ainsi, il est autoris de dclarer des valeurs de type struct comme constantes. Par
exemple :
const struct point A ;

Le type des champs dune structure :

Les champs dune structure peuvent tre :


- de nimporte quel type de base
- des tableaux dlments de type quelconque
- des pointeurs
- des structures /!\ une structure peut comporter de champs de son type mais il faut le
dclarer au pralable de cette faon :
typedef struct personne pers ; /* pers est de type struct personne */
struct personne {

char nom[20], prenom[15];


int age ;
pers * pere ;

};

Dclaration de variable de type structure :

Il existe trois manires de dclarer des variables de type structure en C :


Premire mthode

Deuxime mthode

Troisime mthode

struct personne{
char nom[20];
char prenom[20];
int no_employe;
};

struct {
char nom[20];
char prenom[20];
int no_employe;
} p1,p2;
struct{
char nom[20];
char prenom[20];
int no_employe;
} p3;

struct personne{
char nom[20];
char prenom[20];
int no_employe;
} p1,p2;

struct personne p1,p2;


p1=p2 ; /* OK */

struct personne p3;


p3 = p1 ; /* NOK */

p3 = p1 ; /* OK */

La premire mthode, dfinit un type structure dont le nom est personne. Cette structure
contient trois champs : un tableau de caractres pour le champ nom, un tableau de caractres
pour le champ prenom et un entier pour le champ no_employe.
Plus loin de cette dclaration, nous dclarons deux variables p1 et p2 de type struct
personne.
Avec cette mthode, il est possible daffecter p1 la valeur de p2, ces deux variables tant
reconnues comme tant du mme type.
2

L1 Informatique Universit Paris 8 - 2010-2011


Programmation Imprative I
Rim Chaabane rchaabane@ai.univ-paris8.fr

- Cours 5 -

La deuxime mthode dfinit le mme type de structure, sauf que cette fois-ci la structure ne
porte pas de nom et est immdiatement suivie des noms de variables p1 et p2 de ce type
structure. Si plus loin on crit la mme dfinition du type de structure (sans nom) suivi dun nom
de variable p3, alors il nous sera possible deffectuer des oprations entre p1 ou p2 et p3.
La troisime mthode dfinit un type structure avec le nom personne suivi immdiatement des
noms de variables p1 et p2. Dans cas si lon cre comme la mthode 1, une troisime variable
p3 de type struct personne, il nous sera impossible deffectuer une quelconque opration
entre p1 ou p2 et p3. Ce dernier ntant pas reconnu comme tant du mme type que p1 et p2.
De ces trois mthodes c'est la premire qui est recommande, car elle permet de bien sparer la
dfinition du type structure de ses utilisations.

1.2.

Reprsentation en mmoire

La norme impose aux objets de type structure les deux contraintes suivantes :
- les champs doivent tre allous selon leur ordre dapparition dans la structure ;
- ladresse dune structure correspond ladresse de son premier champ.
Ainsi dans les dfinitions suivantes, lordre dapparition des champs est le mme :
struct s1 {
int n, p ;
float x, y ;
};

struct s2 {
int n ;
int p ;
float x ;
float y;
};

struct s1 test ;
@m
n

1.3.

@m+1
p

@m+2
x

@m+3
y

test

Initialisation

Il existe deux mthodes pour initialiser une variable de type structure :


Premire mthode : linitialisation se fait juste au moment de la dclaration de la variable
de type structure.
Deuxime mthode : linitialisation se fait aprs la dclaration de la variable de type
structure.
struct personne{
char nom[20];
char prenom[20];
int no_employe;
};
struct personne p1 = {"Dupond", "Jean", 7845}; /* mthode 1 */

struct personne p2 ;
3

L1 Informatique Universit Paris 8 - 2010-2011


Programmation Imprative I
Rim Chaabane rchaabane@ai.univ-paris8.fr

- Cours 5 -

p2.nom = " Dupond";


p2.prenom = "Jean" ;
p2.no_employe = 7845 ;

/* mthode 2 */

Pour accder aux champs de la variable p2, il suffit de faire suivre le nom de la variable dun point
suivi du nom du champ.

Nous dclarons et initialisons maintenant un tableau de 3 lments de type struct


personne :
- Avec la mthode 1 :
struct personne tab[3] = { {"Dupond", "Jean", 7845},
{"Le Notre", "Alfred", 4321},
{"Le Gall", "Marc", 5678}} ;

- Ou bien nous linitialisons avec la mthode 2 :


struct personne tab[3] ;
tab[0].nom = "Dupond";
tab[0].prenom = "Jean";
tab[0].no_employe = 7845;
tab[1].nom = "Le Notre";
tab[1].prenom = "Alfred";
tab[1].no_employe = 1234;
tab[2].nom = "Le Gall";
tab[2].prenom = "Marc";
tab[2].no_employe = 5678;

Nous pouvons, alors noter quil est plus simple dinitialiser un tableau de structures avec la
premire mthode. La seconde mthode est plutt prconise dans le cas ou les donnes du
tableau ne sont pas connues en dbut de programme. Exemple : le programme lit les donnes du
tableau de structures partir dun fichier de donnes.
Pour initialiser une variable de type structure, il nest pas ncessaire de renseigner tous les champs
de la structure. Par exemple :
struct personne tab[3] = { {"Dupond", "Jean", 7845}, /* Correct */
{"Le Notre",}, /* Correct */
/* le troisime lment du
tableau napparait pas mais
tant donn que cest le dernier
son absence ne gne pas la
compilation */
};

Il est galement possible daffecter une valeur de structure une autre, exemple :
struct personne p1, p2 = {"Dupond", "Jean", 7845};
p1=p2 ;

1.4.

Exemple dutilisation

L1 Informatique Universit Paris 8 - 2010-2011


Programmation Imprative I
Rim Chaabane rchaabane@ai.univ-paris8.fr

- Cours 5 -

2. Introduction la notion de pointeur


Les pointeurs permettent de manipuler directement les adresses mmoire des objets cres ; tels
que les variables, les pointeurs ou encore les structures.
Soit les dclarations suivantes :
int n, t[5] ;
n est une variable de type int et t est un tableau de 5 lments de type int.
Pour obtenir ladresse de la variable n ou du tableau t il suffit de faire prcder le nom de
lobjet par un & :
&n ;
&t ;
Un pointeur en C contient ladresse mmoire dun objet. Pour dclarer par exemple un pointeur
sur ladresse mmoire de la variable n il suffit dcrire :
int *pn ; /* on dit que pn est le pointeur sur un objet de type int */
ou
int * pn ;
Il peut donc aussi bien contenir ladresse de la variable n (qui est destine contenir un int)
que ladresse dun lment du tableau t comme par exemple &t[2]:
pn = &n ;
ou
5

L1 Informatique Universit Paris 8 - 2010-2011


Programmation Imprative I
Rim Chaabane rchaabane@ai.univ-paris8.fr

- Cours 5 -

pn=&t[2] ;
Nous initialisons donc de cette faon une variable de type pointeur avec des adresses mmoire
dobjets de types int.
Pour accder au contenu dune adresse mmoire, il faut faire appel au pointeur prcd dune
toile comme ci-dessous :
*pn = 20 ; /* on place lentier 20 dans ladresse mmoire contenue dans pn */
Instruction C

description

Valeur
contenue
dans @m

int n = 3;

Rserve une adresse


mmoire @m qui
contient lentier 3.
Dclare un pointeur pn
sur un entier.
Initialise le pointeur pn
ladresse de n.
La variable l prend
comme
valeur
le
contenu de ladresse
pointe par pn.
Ladresse pointe par
pn
contient
maintenant la valeur 9.
Affiche le contenu de
@m

int * pn ;
pn = &n ;
int l = *pn ;

*pn = 9 ;

printf("%d\n",
*pn) ;

Rsultat

3
3

pn = @m

l = 3

pn = @m
n = 9
*(@m)= 9
9

Affectation de pointeur :

p=NULL ;

//on cre un pointeur vide qui ne contient aucune adresse


mmoire
p = q ;
//p et q pointent sur le mme objet
*p = *q ;
//ladresse pointe par p contiendra lobjet point par q
if (p==q) {} // si p et q pointent sur le mme objet
if (p !=q) {} //si p et q ne pointent pas sur le mme objet
p+1 ;
//pointe sur lobjet suivant de type t (idem pour p++).
p-q ;
//retourne le nombre dobjets de type point entre les
adresses pointes par p et q.

Vous aimerez peut-être aussi