49

Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Embed Size (px)

Citation preview

Page 1: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Algorithmes et programmation II :Les pointeurs

Souheib Baarir1

1Université Paris Ouest Nanterre La Défense.

Laboratoire d'informatique de Paris 6.

[email protected]

Licence Mia - 2010/2011

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 1 / 27

Page 2: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Grandes lignes du cours

Introduction

Les pointeursDé�nition des pointeursArithmétique des pointeursAllocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 2 / 27

Page 3: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Introduction

Introduction

Les pointeursDé�nition des pointeursArithmétique des pointeursAllocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 3 / 27

Page 4: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Introduction

I Toute variable manipulée dans un programme est stockéequelque part en mémoire centrale.

I La mémoire peut être assimilée à un �tableau� dont chaqueélément est identi�é par une `adresse'.

I Pour retrouver une variable, il su�t, donc, de connaîtrel'adresse de l'élément-mémoire ou elle est stockée.

I C'est le compilateur qui fait le lien entre l'identi�cateur d'unevariable et son adresse en mémoire.

I Il peut être cependant plus intéressant de décrire une variablenon plus par son identi�cateur mais directement par sonadresse !

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 4 / 27

Page 5: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Introduction

I Toute variable manipulée dans un programme est stockéequelque part en mémoire centrale.

I La mémoire peut être assimilée à un �tableau� dont chaqueélément est identi�é par une `adresse'.

I Pour retrouver une variable, il su�t, donc, de connaîtrel'adresse de l'élément-mémoire ou elle est stockée.

I C'est le compilateur qui fait le lien entre l'identi�cateur d'unevariable et son adresse en mémoire.

I Il peut être cependant plus intéressant de décrire une variablenon plus par son identi�cateur mais directement par sonadresse !

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 4 / 27

Page 6: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Introduction

I Toute variable manipulée dans un programme est stockéequelque part en mémoire centrale.

I La mémoire peut être assimilée à un �tableau� dont chaqueélément est identi�é par une `adresse'.

I Pour retrouver une variable, il su�t, donc, de connaîtrel'adresse de l'élément-mémoire ou elle est stockée.

I C'est le compilateur qui fait le lien entre l'identi�cateur d'unevariable et son adresse en mémoire.

I Il peut être cependant plus intéressant de décrire une variablenon plus par son identi�cateur mais directement par sonadresse !

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 4 / 27

Page 7: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Introduction

I Toute variable manipulée dans un programme est stockéequelque part en mémoire centrale.

I La mémoire peut être assimilée à un �tableau� dont chaqueélément est identi�é par une `adresse'.

I Pour retrouver une variable, il su�t, donc, de connaîtrel'adresse de l'élément-mémoire ou elle est stockée.

I C'est le compilateur qui fait le lien entre l'identi�cateur d'unevariable et son adresse en mémoire.

I Il peut être cependant plus intéressant de décrire une variablenon plus par son identi�cateur mais directement par sonadresse !

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 4 / 27

Page 8: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Introduction

I Toute variable manipulée dans un programme est stockéequelque part en mémoire centrale.

I La mémoire peut être assimilée à un �tableau� dont chaqueélément est identi�é par une `adresse'.

I Pour retrouver une variable, il su�t, donc, de connaîtrel'adresse de l'élément-mémoire ou elle est stockée.

I C'est le compilateur qui fait le lien entre l'identi�cateur d'unevariable et son adresse en mémoire.

I Il peut être cependant plus intéressant de décrire une variablenon plus par son identi�cateur mais directement par sonadresse !

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 4 / 27

Page 9: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Lvalue : adresse et valeur

Dé�nition

On appelle Lvalue (left value) toute expression du langage pou-vant être placé à gauche d'un opérateur d'a�ectation.

Caractérisation

Une Lvalue est caractérisée par :

I son adresse : i.e., l'adresse mémoire à partir de laquellel'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

Page 10: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Lvalue : adresse et valeur

Dé�nition

On appelle Lvalue (left value) toute expression du langage pou-vant être placé à gauche d'un opérateur d'a�ectation.

Caractérisation

Une Lvalue est caractérisée par :

I son adresse : i.e., l'adresse mémoire à partir de laquellel'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

Page 11: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Lvalue : adresse et valeur

Dé�nition

On appelle Lvalue (left value) toute expression du langage pou-vant être placé à gauche d'un opérateur d'a�ectation.

Caractérisation

Une Lvalue est caractérisée par :

I son adresse : i.e., l'adresse mémoire à partir de laquellel'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

Page 12: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Lvalue : exemple

i n t 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

i 4831830000 1

j 4831830004 1

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

Page 13: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Lvalue : exemple

i n t 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

i 4831830000 1

j 4831830004 1

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

Page 14: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Lvalue : exemple

i n t 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

i 4831830000 1

j 4831830004 1

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

Page 15: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Lvalue : exemple

i n t 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

i 4831830000 1

j 4831830004 1

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

Page 16: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Lvalue : récupérer l'adresse

L'opérateur adresse

Pour acceder à l'adresse d'une variable (lvalue) nous disposonsde l'opérateur unaire &.

Par l'exemple :

i n t 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 alorsl'a�chage sera : l'adresse de i = 4831830000

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 7 / 27

Page 17: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Les pointeurs

Introduction

Les pointeursDé�nition des pointeursArithmétique des pointeursAllocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 8 / 27

Page 18: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Outline

Introduction

Les pointeursDé�nition des pointeursArithmétique des pointeursAllocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 9 / 27

Page 19: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Dé�nition des pointeurs

Introduction

Les pointeursDé�nition des pointeursArithmétique des pointeursAllocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 10 / 27

Page 20: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Notion de pointeur

Dé�nition

Un pointeur est une lvalue dont la valeur est égale à l'adressed'une autre lvalue.

Déclaration

type *nomPointeur (où type est le type de l'élément pointé).

Exemple :

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

Lvalue Adresse Valeur

i 4830000 3

p 4830004 4830000

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 11 / 27

Page 21: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Notion de pointeur

Dé�nition

Un pointeur est une lvalue dont la valeur est égale à l'adressed'une autre lvalue.

Déclaration

type *nomPointeur (où type est le type de l'élément pointé).

Exemple :

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

Lvalue Adresse Valeur

i 4830000 3

p 4830004 4830000

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 11 / 27

Page 22: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Notion de pointeur

Dé�nition

Un pointeur est une lvalue dont la valeur est égale à l'adressed'une autre lvalue.

Déclaration

type *nomPointeur (où type est le type de l'élément pointé).

Exemple :

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

Lvalue Adresse Valeur

i 4830000 3

p 4830004 4830000

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 11 / 27

Page 23: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Notion de pointeur

Dé�nition

Un pointeur est une lvalue dont la valeur est égale à l'adressed'une autre lvalue.

Déclaration

type *nomPointeur (où type est le type de l'élément pointé).

Exemple :

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

Lvalue Adresse Valeur

i 4830000 3

p 4830004 4830000

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 11 / 27

Page 24: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Pointeur : opérateur unaire d'indirection (1/3)

Problème

Comment peut-on accéder directement à l'element pointé par lavaleur d'un pointeur ?

Exemple :i n t i =3;i n t ∗p ;p = &i ;

Lvalue Adresse Valeur

i 4830000 3

p 4830004 4830000

Solution

Utilisation d'un nouvel opérateur unaire : � * �

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 12 / 27

Page 25: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Pointeur : opérateur 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 Valeur

i 4830000 3

p 4830004 4830000

*p 4830000 3

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 13 / 27

Page 26: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Pointeur : opérateur unaire d'indirection (3/3)

i n tmain ( i n t arv , char ∗ arg [ ] ){

i n t i =3, j =6;i n t ∗p1 ,∗ p2 ;p1 = &i ;p2 = &j ;∗p1=∗p2

}

i n tmain ( i n t arv , char ∗ arg [ ] ){

i n t i =3, j =6;i n t ∗p1 ,∗ p2 ;p1 = &i ;p2 = &j ;p1=p2 ;

}

Lvalue Adresse Valeuri 4830000 3j 4830004 6p1 4835984 4830000p2 4835982 4830004

Lvalue Adresse Valeuri 4830000 6j 4830004 6p1 4835984 4830000p2 4835982 4830004

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 14 / 27

Page 27: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Pointeur : opérateur unaire d'indirection (3/3)

i n tmain ( i n t arv , char ∗ arg [ ] ){

i n t i =3, j =6;i n t ∗p1 ,∗ p2 ;p1 = &i ;p2 = &j ;∗p1=∗p2

}

i n tmain ( i n t arv , char ∗ arg [ ] ){

i n t i =3, j =6;i n t ∗p1 ,∗ p2 ;p1 = &i ;p2 = &j ;p1=p2 ;

}

Lvalue Adresse Valeuri 4830000 3j 4830004 6p1 4835984 4830000p2 4835982 4830004

Lvalue Adresse Valeuri 4830000 6j 4830004 6p1 4835984 4830000p2 4835982 4830004

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 14 / 27

Page 28: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Pointeur : opérateur unaire d'indirection (3/3)

i n tmain ( i n t arv , char ∗ arg [ ] ){

i n t i =3, j =6;i n t ∗p1 ,∗ p2 ;p1 = &i ;p2 = &j ;∗p1=∗p2

}

i n tmain ( i n t arv , char ∗ arg [ ] ){

i n t i =3, j =6;i n t ∗p1 ,∗ p2 ;p1 = &i ;p2 = &j ;p1=p2 ;

}

Lvalue Adresse Valeuri 4830000 3j 4830004 6p1 4835984 4830000p2 4835982 4830004

Lvalue Adresse Valeuri 4830000 6j 4830004 6p1 4835984 4830000p2 4835982 4830004

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 14 / 27

Page 29: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Outline

Introduction

Les pointeursDé�nition des pointeursArithmétique des pointeursAllocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 15 / 27

Page 30: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Arithmétique des pointeurs

Introduction

Les pointeursDé�nition des pointeursArithmétique des pointeursAllocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 16 / 27

Page 31: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Arithmétique des pointeurs

I La valeur d'un pointeur est un entier.

I On peut appliquer à un pointeur quelqueopérations arithmétiques :

I Addition d'un entier à un pointeur.

I Soustraction d'un entier à pointeur.

I Di�érence entre deux pointeurs (de même type).

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 17 / 27

Page 32: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Arithmétique des pointeurs

I La valeur d'un pointeur est un entier.

I On peut appliquer à un pointeur quelqueopérations arithmétiques :

I Addition d'un entier à un pointeur.

I Soustraction d'un entier à pointeur.

I Di�érence entre deux pointeurs (de même type).

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 17 / 27

Page 33: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Arithmétique des pointeurs : l'addition et la soustraction

I Soit i un entier et p un pointeur sur un element de type type,

I l'expression p′ = p + i (resp. p′ = p − i) désigne un pointeursur un element de type type,

I la valeur de p′ est égale à la valeur de p incrémenté (resp.décrémenté) de i ∗ sizeof (type).

i n tmain ( i n t arv , char ∗ arg [ ] ) {

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 :

Lvalue Adresse Valeur

i 4830000 5

p1 4830004 4830008

p2 4830008 4830000

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 18 / 27

Page 34: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Arithmétique des pointeurs : l'addition et la soustraction

I Soit i un entier et p un pointeur sur un element de type type,

I l'expression p′ = p + i (resp. p′ = p − i) désigne un pointeursur un element de type type,

I la valeur de p′ est égale à la valeur de p incrémenté (resp.décrémenté) de i ∗ sizeof (type).

i n tmain ( i n t arv , char ∗ arg [ ] ) {

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 :

Lvalue Adresse Valeur

i 4830000 5

p1 4830004 4830008

p2 4830008 4830000

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 18 / 27

Page 35: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Arithmétique des pointeurs : la di�érence

I Soit p et q deux pointeurs sur des elements de type type,

I l'expression p − q désigne un entier dont la valeur est :(p − q)/sizeof (type),

i n tmain ( i n t arv , char ∗ arg [ ] ) {

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 Valeur

i 4830000 5

p1 4830004 4830008

p2 4830008 4830000

j 4830016 2

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 19 / 27

Page 36: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Arithmétique des pointeurs : la di�érence

I Soit p et q deux pointeurs sur des elements de type type,

I l'expression p − q désigne un entier dont la valeur est :(p − q)/sizeof (type),

i n tmain ( i n t arv , char ∗ arg [ ] ) {

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 Valeur

i 4830000 5

p1 4830004 4830008

p2 4830008 4830000

j 4830016 2

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 19 / 27

Page 37: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Outline

Introduction

Les pointeursDé�nition des pointeursArithmétique des pointeursAllocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 20 / 27

Page 38: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Allocation dynamique

Introduction

Les pointeursDé�nition des pointeursArithmétique des pointeursAllocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 21 / 27

Page 39: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Initialisation d'un pointeur

Avant toute utilisation, un pointeur doit être initialisé (sinon, ilpeut pointer sur n'importe quelle région de la mémoire !) :

I soit par l'a�ectation d'une valeur �nulle� à unpointeur :p = NULL ;

I soit par l'a�ectation de l'adresse d'une autre variable(lvalue) : p = &i ;

I soit par l'allocation dynamique d'un nouvelespace-mémoire...

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 22 / 27

Page 40: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Initialisation d'un pointeur

Avant toute utilisation, un pointeur doit être initialisé (sinon, ilpeut pointer sur n'importe quelle région de la mémoire !) :

I soit par l'a�ectation d'une valeur �nulle� à unpointeur :p = NULL ;

I soit par l'a�ectation de l'adresse d'une autre variable(lvalue) : p = &i ;

I soit par l'allocation dynamique d'un nouvelespace-mémoire...

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 22 / 27

Page 41: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Initialisation d'un pointeur

Avant toute utilisation, un pointeur doit être initialisé (sinon, ilpeut pointer sur n'importe quelle région de la mémoire !) :

I soit par l'a�ectation d'une valeur �nulle� à unpointeur :p = NULL ;

I soit par l'a�ectation de l'adresse d'une autre variable(lvalue) : p = &i ;

I soit par l'allocation dynamique d'un nouvelespace-mémoire...

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 22 / 27

Page 42: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Allocation dynamique : dé�nition

Dé�nition

L'allocation dynamique est l'opération qui consiste à réserver unespace-mémoire d'une taille dé�nie.

I L'allocation dynamique en C se fait par l'intermédiaire (entreautre) de la fonction de la libraire standard stdlib.h :

char* malloc(nombreOctets)

I Par défaut, cette fonction retourne un char * pointant versune espace mémoire de taille nombreOctets.

I Il faut convertir le de sortie de malloc à l'aide d'un cast, pourdes pointeur qui ne sont pas des char *

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 23 / 27

Page 43: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Allocation dynamique : exemple

#include <s t d l i b . h>

i n t main ( i n t arv , char ∗ arg [ ] ) {i n t i = 3 , ∗p ;p = ( i n t ∗) ma l l o c ( sizeof ( i n t ) ) ;∗p = i ;

}

Lvalue Adresse Valeur

i 4830000 3

p 4830004 ?

Lvalue Adresse Valeur

i 4830000 3

p 4830004 4830008

*p 4830008 ?

Lvalue Adresse Valeur

i 4830000 3

p 4830004 4830008

*p 4830008 3

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 24 / 27

Page 44: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Allocation dynamique : exemple

#include <s t d l i b . h>

i n t main ( i n t arv , char ∗ arg [ ] ) {i n t i = 3 , ∗p ;p = ( i n t ∗) ma l l o c ( sizeof ( i n t ) ) ;∗p = i ;

}

Lvalue Adresse Valeur

i 4830000 3

p 4830004 ?

Lvalue Adresse Valeur

i 4830000 3

p 4830004 4830008

*p 4830008 ?

Lvalue Adresse Valeur

i 4830000 3

p 4830004 4830008

*p 4830008 3

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 24 / 27

Page 45: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Allocation dynamique : exemple

#include <s t d l i b . h>

i n t main ( i n t arv , char ∗ arg [ ] ) {i n t i = 3 , ∗p ;p = ( i n t ∗) ma l l o c ( sizeof ( i n t ) ) ;∗p = i ;

}

Lvalue Adresse Valeur

i 4830000 3

p 4830004 ?

Lvalue Adresse Valeur

i 4830000 3

p 4830004 4830008

*p 4830008 ?

Lvalue Adresse Valeur

i 4830000 3

p 4830004 4830008

*p 4830008 3

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 24 / 27

Page 46: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Allocation dynamique : la libération mémoire

Dé�nition

C'est l'opération qui consiste à libérer l'espace-mémoire alloué.

I En C, la libération mémoire se fait par l'intermédiaire de lafonction de la libraire standard stdlib.h :

void free(nomPointeur)

I Tout espace-mémoire alloué dynamiquement via malloc (ouéquivalent) doit obligatoirement être désalloué par free, sinonnous rencontrons le fameux problème de fuite mémoire(memory leak).

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 25 / 27

Page 47: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Pointeurs et tableaux

Introduction

Les pointeursDé�nition des pointeursArithmétique des pointeursAllocation dynamique

Pointeurs et tableaux

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 26 / 27

Page 48: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Pointeurs et tableaux à une dimension

À retenir

Tout tableau en C est en fait un pointeur constant !

Soit int tab[N] un tableau alors tab est un pointeur constant quia pour valeur &tab[0].

i n t main ( i n t arv , char ∗ arg [ ] ) {i n t tab [ 5 ]={1 , 2 , 3 , 4 , 5} ;i n t i , ∗p ;p = tab ;for ( i=0 ; i <5 ; ++i )p r i n t f ( " ∗( p+i ) = %d = p [ i ] = %d = tab [ i ] = %d \n" ,

∗( p+i ) , p [ i ] , tab [ i ] ) ;}

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 27 / 27

Page 49: Algorithmes et programmation II : Les pointeurs · Algorithmes et programmation II : Les pointeurs Souheib Baarir 1 1 Université Paris Ouest Nanterre La Défense. Laboratoire d'informatique

Pointeurs et tableaux à une dimension

À retenir

Tout tableau en C est en fait un pointeur constant !

Soit int tab[N] un tableau alors tab est un pointeur constant quia pour valeur &tab[0].

i n t main ( i n t arv , char ∗ arg [ ] ) {i n t tab [ 5 ]={1 , 2 , 3 , 4 , 5} ;i n t i , ∗p ;p = tab ;for ( i=0 ; i <5 ; ++i )p r i n t f ( " ∗( p+i ) = %d = p [ i ] = %d = tab [ i ] = %d \n" ,

∗( p+i ) , p [ i ] , tab [ i ] ) ;}

S. Baarir (Paris10/LIP6) Les pointeurs L2 Mia - 2010/2011 27 / 27