Vous êtes sur la page 1sur 49

Algorithmes et programmation II : Les pointeurs

Souheib Baarir
1
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
Toute variable manipule dans un programme est stocke quelque part en

mmoire centrale.

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

4 / 27

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

mmoire centrale.

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
Toute variable manipule dans un programme est stocke quelque part en

mmoire centrale.

La mmoire peut tre assimile un tableau dont chaque lment est identi par une `adresse'. 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
Toute variable manipule dans un programme est stocke quelque part en

mmoire centrale.

La mmoire peut tre assimile un tableau dont chaque lment est identi par une `adresse'. Pour retrouver une variable, il sut, donc, de connatre l'adresse de l'lment-mmoire ou elle est stocke. 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
Toute variable manipule dans un programme est stocke quelque part en

mmoire centrale.

La mmoire peut tre assimile un tableau dont chaque lment est identi par une `adresse'. Pour retrouver une variable, il sut, donc, de connatre l'adresse de l'lment-mmoire ou elle est stocke. C'est le compilateur qui fait le lien entre l'identicateur d'une variable et son adresse en mmoire. 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 : son

adresse

: i.e., l'adresse mmoire partir de laquelle

l'objet est stock ; sa

valeur

: i.e., ce qui est stock cette adresse.

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 : son

adresse

: i.e., l'adresse mmoire partir de laquelle

l'objet est stock ; 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 :
Lvalue

Adresse 4831830000 4831830004

Valeur 1 1

i j

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 :
Lvalue

Adresse 4831830000 4831830004

Valeur 1 1

i j

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
(o

type

est le type de l'lment point).

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
Exemple : (o

type

est le type de l'lment point).

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
Exemple : (o

type

est le type de l'lment point).

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

Lvalue

Adresse 4830000 4830004


Les pointeurs

Valeur 3 4830000
L2 Mia - 2010/2011 11 / 27

i p

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 4830000 4830004

Valeur 3 4830000

i p

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 ) ;


Lvalue

Adresse 4830000 4830004 4830000

Valeur 3 4830000 3

i p *p

S. Baarir (Paris10/LIP6)

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 } 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

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 } 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 3 6 4830000 4830004

S. Baarir (Paris10/LIP6)

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 } 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 3 6 4830000 4830004

Lvalue
i j p1 p2

Adresse 4830000 4830004 4835984 4835982

Valeur 6 6 4830000 4830004

S. Baarir (Paris10/LIP6)

Les pointeurs

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).

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

17 / 27

Arithmtique des pointeurs : l'addition et la soustraction


Soit i un entier et p un pointeur sur un element de type type , l'expression p

=p+i

(resp. p

= p i)

dsigne un pointeur

sur un element de type type , la valeur de p est gale la valeur de p incrment (resp. dcrment) de i

sizeof

(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


Soit i un entier et p un pointeur sur un element de type type , l'expression p

=p+i

(resp. p

= p i)

dsigne un pointeur

sur un element de type type , la valeur de p est gale la valeur de p incrment (resp. dcrment) de i

sizeof

(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

Lvalue

Adresse 4830000 4830004 4830008

Valeur 5 4830008 4830000

i p1 p2

L2 Mia - 2010/2011

18 / 27

Arithmtique des pointeurs : la dirence


Soit p et q deux pointeurs sur des elements de type type , l'expression p

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

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


Soit p et q deux pointeurs sur des elements de type type , l'expression p

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

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 :

Lvalue

Adresse 4830000 4830004 4830008 4830016

Valeur 5 4830008 4830000 2

i p1 p2 j

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 !) : soit par l'aectation d'une valeur nulle un pointeur :

p = NULL ;

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 !) : soit par l'aectation d'une valeur nulle un pointeur :

p = NULL ; p = &i ;

soit par l'aectation de l'adresse d'une autre variable (lvalue) :

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 !) : soit par l'aectation d'une valeur nulle un pointeur :

p = NULL ; p = &i ;

soit par l'aectation de l'adresse d'une autre variable (lvalue) :

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.

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 ; }
Adresse 4830000 4830004 Valeur 3 ?

Lvalue

i p

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 ; }
Lvalue

Adresse 4830000 4830004 4830008

Valeur 3 4830008 ?

i p *p

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 ; }

Lvalue

Adresse 4830000 4830004 4830008


Les pointeurs

Valeur 3 4830008 3
L2 Mia - 2010/2011 24 / 27

i p *p
S. Baarir (Paris10/LIP6)

Allocation dynamique : la libration mmoire Dnition


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

En C, la libration mmoire se fait par l'intermdiaire de la fonction de la libraire standard

stdlib.h : void free(nomPointeur) malloc (ou par free, sinon

Tout espace-mmoire allou dynamiquement via quivalent) doit obligatoirement tre dsallou (memory leak).

nous rencontrons le fameux problme de fuite mmoire

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 !

Soit a

int tab[N] un tableau pour valeur &tab[0].

alors

tab

est un pointeur constant qui

S. Baarir (Paris10/LIP6)

Les pointeurs

L2 Mia - 2010/2011

27 / 27

Pointeurs et tableaux une dimension retenir


Tout tableau en C est en fait un pointeur constant !

Soit a

int tab[N] un tableau pour valeur &tab[0].

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