Vous êtes sur la page 1sur 49

Algorithmes et programmation II :

Les pointeurs
1

Souheib Baarir
1

Universit Paris Ouest Nanterre La Dfense.


Laboratoire d'informatique de Paris 6.
Souheib.baarir@u-paris10.fr

Licence Mia - 2010/2011

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

1 / 27

Grandes lignes du cours

Introduction

Les pointeurs
Dnition des pointeurs
Arithmtique des pointeurs
Allocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

2 / 27

Introduction

Introduction

Les pointeurs
Dnition des pointeurs
Arithmtique des pointeurs
Allocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

3 / 27

Introduction
I Toute variable manipule dans un programme est stocke
quelque part en

S. Baarir (Paris10/LIP6)

mmoire centrale.

Les pointeurs

L2 Mia - 2010/2011

4 / 27

Introduction
I Toute variable manipule dans un programme est stocke
quelque part en

mmoire centrale.

I La mmoire peut tre assimile un tableau dont chaque


lment est identi par une `adresse'.

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

4 / 27

Introduction
I Toute variable manipule dans un programme est stocke
quelque part en

mmoire centrale.

I La mmoire peut tre assimile un tableau dont chaque


lment est identi par une `adresse'.

I Pour retrouver une variable, il sut, donc, de connatre


l'adresse de l'lment-mmoire ou elle est stocke.

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

4 / 27

Introduction
I Toute variable manipule dans un programme est stocke
quelque part en

mmoire centrale.

I La mmoire peut tre assimile un tableau dont chaque


lment est identi par une `adresse'.

I Pour retrouver une variable, il sut, donc, de connatre


l'adresse de l'lment-mmoire ou elle est stocke.

I C'est le compilateur qui fait le lien entre l'identicateur d'une


variable et son adresse en mmoire.

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

4 / 27

Introduction
I Toute variable manipule dans un programme est stocke
quelque part en

mmoire centrale.

I La mmoire peut tre assimile un tableau dont chaque


lment est identi par une `adresse'.

I Pour retrouver une variable, il sut, donc, de connatre


l'adresse de l'lment-mmoire ou elle est stocke.

I C'est le compilateur qui fait le lien entre l'identicateur d'une


variable et son adresse en mmoire.

I Il peut tre cependant plus intressant de dcrire une variable


non plus par son identicateur mais directement par son
adresse !

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

4 / 27

Lvalue : adresse et valeur

Dnition
On appelle

Lvalue (left value)

toute expression du langage pou-

vant tre plac gauche d'un oprateur d'aectation.

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

5 / 27

Lvalue : adresse et valeur

Dnition
On appelle

Lvalue (left value)

toute expression du langage pou-

vant tre plac gauche d'un oprateur d'aectation.

Caractrisation
Une Lvalue est caractrise par :

I son adresse :

i.e.,

l'adresse mmoire partir de laquelle

l'objet est stock ;

I sa valeur :

S. Baarir (Paris10/LIP6)

i.e.,

ce qui est stock cette adresse.

Les pointeurs

L2 Mia - 2010/2011

5 / 27

Lvalue : adresse et valeur

Dnition
On appelle

Lvalue (left value)

toute expression du langage pou-

vant tre plac gauche d'un oprateur d'aectation.

Caractrisation
Une Lvalue est caractrise par :

I son adresse :

i.e.,

l'adresse mmoire partir de laquelle

l'objet est stock ;

I sa valeur :

i.e.,

ce qui est stock cette adresse.

Une variable est un exemple concret de Lvalue.


S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

5 / 27

Lvalue : exemple
int i , j ;
i =1;
j=i ;

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

6 / 27

Lvalue : exemple
int i , j ;
i =1;
j=i ;
Si le compilateur a plac la variable i l'adresse 4831830000 et j
l'adresse 4831830004, alors :

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

6 / 27

Lvalue : exemple
int i , j ;
i =1;
j=i ;
Si le compilateur a plac la variable i l'adresse 4831830000 et j
l'adresse 4831830004, alors :

S. Baarir (Paris10/LIP6)

Lvalue

Adresse

Valeur

4831830000

4831830004

Les pointeurs

L2 Mia - 2010/2011

6 / 27

Lvalue : exemple
int i , j ;
i =1;
j=i ;
Si le compilateur a plac la variable i l'adresse 4831830000 et j
l'adresse 4831830004, alors :
Lvalue

Adresse

Valeur

4831830000

4831830004

Remarque
L'adresse d'une lvalue est un entier (16 bits, 32 bits ou 64 bits)
et ce quelque soit le type de la valeur de lvalue.

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

6 / 27

Lvalue : rcuprer l'adresse

L'oprateur adresse
Pour acceder l'adresse d'une variable (lvalue) nous disposons
de l'oprateur unaire

&.

Par l'exemple :

int i ;
p r i n t f ( " l ' a d r e s s e de i = %l d " ,& i ) ;
Si le compilateur a plac la variable i l'adresse 4831830000 alors
l'achage sera : l'adresse de i = 4831830000

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

7 / 27

Les pointeurs

Introduction

Les pointeurs
Dnition des pointeurs
Arithmtique des pointeurs
Allocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

8 / 27

Outline

Introduction

Les pointeurs
Dnition des pointeurs
Arithmtique des pointeurs
Allocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

9 / 27

Dnition des pointeurs

Introduction

Les pointeurs
Dnition des pointeurs
Arithmtique des pointeurs
Allocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

10 / 27

Notion de pointeur
Dnition
Un pointeur est une lvalue dont la valeur est gale l'adresse
d'une autre lvalue.

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

11 / 27

Notion de pointeur
Dnition
Un pointeur est une lvalue dont la valeur est gale l'adresse
d'une autre lvalue.

Dclaration
type *nomPointeur

S. Baarir (Paris10/LIP6)

(o

type

est le type de l'lment point).

Les pointeurs

L2 Mia - 2010/2011

11 / 27

Notion de pointeur
Dnition
Un pointeur est une lvalue dont la valeur est gale l'adresse
d'une autre lvalue.

Dclaration
type *nomPointeur

(o

type

est le type de l'lment point).

Exemple :

i n t i =3;
i n t p ;
p = &i ;
S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

11 / 27

Notion de pointeur
Dnition
Un pointeur est une lvalue dont la valeur est gale l'adresse
d'une autre lvalue.

Dclaration
type *nomPointeur

(o

type

est le type de l'lment point).

Exemple :

i n t i =3;
i n t p ;
p = &i ;
S. Baarir (Paris10/LIP6)

Lvalue

Adresse

Valeur

4830000

4830004

4830000

Les pointeurs

L2 Mia - 2010/2011

11 / 27

Pointeur : oprateur unaire d'indirection (1/3)


Problme
Comment peut-on accder directement l'element point par la
valeur d'un pointeur ?

Exemple :

i n t i =3;
i n t p ;
p = &i ;

Lvalue

Adresse

Valeur

4830000

4830004

4830000

Solution
Utilisation d'un nouvel oprateur unaire :  * 

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

12 / 27

Pointeur : oprateur unaire d'indirection (2/3)

Exemple :

i n t i =3;
i n t p ;
p = &i ;
p r i n t f ( " La v a l e u r de p = %d" , p ) ;

S. Baarir (Paris10/LIP6)

Lvalue

Adresse

Valeur

4830000

4830004

4830000

*p

4830000

Les pointeurs

L2 Mia - 2010/2011

13 / 27

Pointeur : oprateur unaire d'indirection (3/3)


int
main ( i n t a r v , char a r g [ ] )
{
i n t i =3, j =6;
i n t p1 , p2 ;
p1 = & i ;
p2 = &j ;
p1= p2
}

S. Baarir (Paris10/LIP6)

Les pointeurs

int
main ( i n t a r v , char a r g [ ] )
{
i n t i =3, j =6;
i n t p1 , p2 ;
p1 = & i ;
p2 = &j ;
p1=p2 ;
}

L2 Mia - 2010/2011

14 / 27

Pointeur : oprateur unaire d'indirection (3/3)


int
main ( i n t a r v , char a r g [ ] )
{
i n t i =3, j =6;
i n t p1 , p2 ;
p1 = & i ;
p2 = &j ;
p1= p2
}

Lvalue
i
j
p1
p2

Adresse
4830000
4830004
4835984
4835982

S. Baarir (Paris10/LIP6)

int
main ( i n t a r v , char a r g [ ] )
{
i n t i =3, j =6;
i n t p1 , p2 ;
p1 = & i ;
p2 = &j ;
p1=p2 ;
}

Valeur
3
6
4830000
4830004

Les pointeurs

L2 Mia - 2010/2011

14 / 27

Pointeur : oprateur unaire d'indirection (3/3)


int
main ( i n t a r v , char a r g [ ] )
{
i n t i =3, j =6;
i n t p1 , p2 ;
p1 = & i ;
p2 = &j ;
p1= p2
}

Lvalue
i
j
p1
p2

Adresse
4830000
4830004
4835984
4835982

S. Baarir (Paris10/LIP6)

Valeur
3
6
4830000
4830004

Les pointeurs

int
main ( i n t a r v , char a r g [ ] )
{
i n t i =3, j =6;
i n t p1 , p2 ;
p1 = & i ;
p2 = &j ;
p1=p2 ;
}

Lvalue
i
j
p1
p2

Adresse
4830000
4830004
4835984
4835982

Valeur
6
6
4830000
4830004

L2 Mia - 2010/2011

14 / 27

Outline

Introduction

Les pointeurs
Dnition des pointeurs
Arithmtique des pointeurs
Allocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

15 / 27

Arithmtique des pointeurs

Introduction

Les pointeurs
Dnition des pointeurs
Arithmtique des pointeurs
Allocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

16 / 27

Arithmtique des pointeurs

La valeur d'un pointeur est un entier.

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

17 / 27

Arithmtique des pointeurs

La valeur d'un pointeur est un entier.


On peut appliquer un pointeur quelque
oprations arithmtiques :
Addition d'un entier un pointeur.
Soustraction d'un entier pointeur.
Dirence entre deux pointeurs (de mme type).
I
I
I

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

17 / 27

Arithmtique des pointeurs : l'addition et la soustraction


I Soit

un entier et p un pointeur sur un element de type type ,

I l'expression

=p+i

(resp. p

= p i)

dsigne un pointeur

sur un element de type type ,

I la valeur de

0 est gale la valeur de

dcrment) de i

sizeof

incrment (resp.

(type ).

int
main ( i n t a r v , char a r g [ ] ) {
i n t i =5;
i n t p1 , p2 ;
p1 = & i + 2 ;
p2 = p1 2 ;
}
S i & i = 4830000 a l o r s :
S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

18 / 27

Arithmtique des pointeurs : l'addition et la soustraction


I Soit

un entier et p un pointeur sur un element de type type ,

I l'expression

=p+i

(resp. p

= p i)

dsigne un pointeur

sur un element de type type ,

I la valeur de

0 est gale la valeur de

dcrment) de i

sizeof

incrment (resp.

(type ).

int
main ( i n t a r v , char a r g [ ] ) {
i n t i =5;
i n t p1 , p2 ;
p1 = & i + 2 ;
p2 = p1 2 ;
}

Lvalue

Adresse

Valeur

4830000

p1

4830004

4830008

p2

4830008

4830000

S i & i = 4830000 a l o r s :
S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

18 / 27

Arithmtique des pointeurs : la dirence


I Soit

et q deux pointeurs sur des elements de type type ,

q dsigne
(p q )/sizeof (type ),

I l'expression

un entier dont la valeur est :

int
main ( i n t a r v , char a r g [ ] ) {
i n t i =5;
i n t p1 , p2 ;
p1 = & i + 2 ;
p2 = p1 2 ;
i n t j = p2 p1 ;
}
S i & i = 4830000 a l o r s :

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

19 / 27

Arithmtique des pointeurs : la dirence


I Soit

et q deux pointeurs sur des elements de type type ,

q dsigne
(p q )/sizeof (type ),

I l'expression

un entier dont la valeur est :

int
main ( i n t a r v , char a r g [ ] ) {
i n t i =5;
i n t p1 , p2 ;
p1 = & i + 2 ;
p2 = p1 2 ;
i n t j = p2 p1 ;
}

Lvalue

Adresse

Valeur

4830000

p1

4830004

4830008

p2

4830008

4830000

4830016

S i & i = 4830000 a l o r s :

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

19 / 27

Outline

Introduction

Les pointeurs
Dnition des pointeurs
Arithmtique des pointeurs
Allocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

20 / 27

Allocation dynamique

Introduction

Les pointeurs
Dnition des pointeurs
Arithmtique des pointeurs
Allocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

21 / 27

Initialisation d'un pointeur


Avant toute utilisation, un pointeur doit tre initialis (sinon, il
peut pointer sur n'importe quelle rgion de la mmoire !) :

I soit par l'aectation d'une valeur nulle un

p = NULL ;

pointeur :

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

22 / 27

Initialisation d'un pointeur


Avant toute utilisation, un pointeur doit tre initialis (sinon, il
peut pointer sur n'importe quelle rgion de la mmoire !) :

I soit par l'aectation d'une valeur nulle un

p = NULL ;

pointeur :

I soit par l'aectation de l'adresse d'une autre variable


(lvalue) :

S. Baarir (Paris10/LIP6)

p = &i ;

Les pointeurs

L2 Mia - 2010/2011

22 / 27

Initialisation d'un pointeur


Avant toute utilisation, un pointeur doit tre initialis (sinon, il
peut pointer sur n'importe quelle rgion de la mmoire !) :

I soit par l'aectation d'une valeur nulle un

p = NULL ;

pointeur :

I soit par l'aectation de l'adresse d'une autre variable


(lvalue) :

p = &i ;

soit par l'allocation dynamique d'un nouvel


espace-mmoire...

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

22 / 27

Allocation dynamique : dnition


Dnition
L'allocation dynamique est l'opration qui consiste rserver un
espace-mmoire d'une taille dnie.

I L'allocation dynamique en C se fait par l'intermdiaire (entre

stdlib.h :
char* malloc(nombreOctets)
Par dfaut, cette fonction retourne un char * pointant vers
une espace mmoire de taille nombreOctets.
Il faut convertir le de sortie de malloc l'aide d'un cast, pour
des pointeur qui ne sont pas des char *
autre) de la fonction de la libraire standard

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

23 / 27

Allocation dynamique : exemple


# include < s t d l i b . h>
i n t main ( i n t a r v , char a r g [ ] ) {
i n t i = 3 , p ;
p = ( i n t ) malloc ( sizeof ( i n t ) ) ;
p = i ;
}

Lvalue

Adresse

Valeur

4830000

4830004

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

24 / 27

Allocation dynamique : exemple


# include < s t d l i b . h>
i n t main ( i n t a r v , char a r g [ ] ) {
i n t i = 3 , p ;
p = ( i n t ) malloc ( sizeof ( i n t ) ) ;
p = i ;
}

S. Baarir (Paris10/LIP6)

Lvalue

Adresse

Valeur

4830000

4830004

4830008

*p

4830008

Les pointeurs

L2 Mia - 2010/2011

24 / 27

Allocation dynamique : exemple


# include < s t d l i b . h>
i n t main ( i n t a r v , char a r g [ ] ) {
i n t i = 3 , p ;
p = ( i n t ) malloc ( sizeof ( i n t ) ) ;
p = i ;
}

S. Baarir (Paris10/LIP6)

Lvalue

Adresse

Valeur

4830000

4830004

4830008

*p

4830008

Les pointeurs

L2 Mia - 2010/2011

24 / 27

Allocation dynamique : la libration mmoire


Dnition
C'est l'opration qui consiste librer l'espace-mmoire allou.

I En C, la libration mmoire se fait par l'intermdiaire de la

stdlib.h :
void free(nomPointeur)

fonction de la libraire standard

malloc (ou
par free, sinon

I Tout espace-mmoire allou dynamiquement via


quivalent) doit obligatoirement tre dsallou

nous rencontrons le fameux problme de fuite mmoire


(memory leak).

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

25 / 27

Pointeurs et tableaux

Introduction

Les pointeurs
Dnition des pointeurs
Arithmtique des pointeurs
Allocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

26 / 27

Pointeurs et tableaux une dimension


retenir
Tout tableau en C est en fait un pointeur constant !

int tab[N] un tableau


pour valeur &tab[0].

Soit
a

S. Baarir (Paris10/LIP6)

alors

tab

Les pointeurs

est un pointeur constant qui

L2 Mia - 2010/2011

27 / 27

Pointeurs et tableaux une dimension


retenir
Tout tableau en C est en fait un pointeur constant !

int tab[N] un tableau


pour valeur &tab[0].

Soit
a

alors

tab

est un pointeur constant qui

i n t main ( i n t a r v , char a r g [ ] ) {
i n t tab [5]={1 ,2 ,3 ,4 ,5};
i n t i , p ;
p = tab ;
f o r ( i =0 ; i <5 ; ++i )
p r i n t f ( " ( p+i ) = %d = p [ i ] = %d = t a b [ i ] = %d \n" ,
( p+i ) , p [ i ] , t a b [ i ] ) ;
}
S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

27 / 27

Vous aimerez peut-être aussi