Académique Documents
Professionnel Documents
Culture Documents
Cours Complements Pointeurs 2020 21
Cours Complements Pointeurs 2020 21
Programmation C
Les pointeurs
Fabien Calcado – Notions de pointeurs
– Manipulation de pointeurs
fabien.calcado@isty.uvsq.fr
• Indirections simples et multiples
– Fonction et pointeur
• Effet de bord à l’aide de passage par copie « de pointeurs »
Mise à disposition de mon cours de 1ère année
– Tableau statique et pointeur :
dans le cadre des rappels / compléments de C • Ecriture équivalente des [ ]
valeur de « a » ? 100
Fabien Calcado ISTY– IATIC3 - 2020/2021 3 Fabien Calcado ISTY– IATIC3 - 2020/2021 4
1
Les pointeurs Les pointeurs
Variable de type « pointeur de » Opérateur spécifique pour les pointeurs
– Un pointeur est une variable – Opérateur « * » : indirection ou déréférencement
• Stocke une valeur adresse (d’une variable du programme)
• Accéder à la valeur située à l’adresse stockée dans le pointeur
» Valeur aléatoire si non initialisée : adresse aléatoire
» Uniquement possible sur les pointeurs
» Accessible / modif iable par son nom : adressage direct
– Pointeur non valide : valeur « NULL »
• Possède un type : « type pointeur de … »
• Le déréférencement conduira à une erreur de segmentation
» Le ty pe de la case mémoire réf érencée doit être précisé
» Taille de la zone mémoire : même taille qu’un ty pe « int » – Exem ple de code et point de vue m émoire
• Localisée en mémoire • Précisez si l’adressage est direct ou indirect
» A sa propre adresse mémoire ou référence ( pointeur multiple) ptr a
int a ; &ptr &a
@direct
Adressage direct int * ptr = NULL ; // @ direct
int * Adre sseMaVariable = & MaVariable ; NULL ?
Type adresse d’ entier Nom du pointeur Adresse d’ une variable int « pointeur non valide »
Fabien Calcado ISTY– IATIC3 - 2020/2021 5 Fabien Calcado ISTY– IATIC3 - 2020/2021 6
Opérateur spécifique pour les pointeurs Opérateur spécifique pour les pointeurs
– Opérateur « * » : indirection ou déréférencement – Opérateur « * » : indirection ou déréférencement
• Accéder à la valeur située à l’adresse stockée dans le pointeur • Accéder à la valeur située à l’adresse stockée dans le pointeur
» Uniquement possible sur les pointeurs » Uniquement possible sur les pointeurs
– Pointeur non valide : valeur « NULL » – Pointeur non valide : valeur « NULL »
• Le déréférencement conduira à une erreur de segmentation • Le déréférencement conduira à une erreur de segmentation
– Exem ple de code et point de vue m émoire – Exem ple de code et point de vue m émoire
• Précisez si l’adressage est direct ou indirect • Précisez si l’adressage est direct ou indirect
ptr a ptr a
int a ; int a ; &ptr ptr (@direct) &a
&ptr &a @direct
int * ptr = NULL ; // @ direct int * ptr = NULL ; // @ direct
NULL &a 100
100 a = 100 ; // @ direct
a = 100 ; // @ direct
ptr = &a ; // @ direct !!
« ptr pointe sur a »
Fabien Calcado ISTY– IATIC3 - 2020/2021 7 Fabien Calcado ISTY– IATIC3 - 2020/2021 8
2
Les pointeurs Les pointeurs
Fabien Calcado ISTY– IATIC3 - 2020/2021 9 Fabien Calcado ISTY– IATIC3 - 2020/2021 10
int a ;
pa int b = 5 ; //@direct pb pa a b
&pa &pb &pa &a &b
int * pb = &b; //@direct
NULL &b NULL ? 5
Fabien Calcado ISTY– IATIC3 - 2020/2021 11 Fabien Calcado ISTY– IATIC3 - 2020/2021 12
3
Les pointeurs Les pointeurs
int a ; int a ;
int b = 5 ; //@direct pb pa a b int b = 5 ; //@direct pb pa a b
&pb &pa &a &b &pb &pa &a &b
int * pb = &b; //@direct int * pb = &b; //@direct
&b NULL
&a ?2 5 &b NULL
&a ?2 5
a = 2 ; //@direct a = 2 ; //@direct
pa = &a ; //@direct pa = &a ; //@direct
2 5
*pb = *pa + b;
Fabien Calcado ISTY– IATIC3 - 2020/2021 13 Fabien Calcado ISTY– IATIC3 - 2020/2021 14
int a ; int a ;
int b = 5 ; //@direct pb pa a b int b = 5 ; //@direct pb pa a b
&pb &pa &a &b &pb &pa &a &b
int * pb = &b; //@direct int * pb = &b; //@direct
&b NULL
&a ?2 57 &b NULL
&a 14
?2 7
a = 1 ; //@direct a = 1 ; //@direct
pa = &a ; //@direct pa = &a ; //@direct
4
Les pointeurs Les pointeurs
int a ; int a ;
int b = 5 ; //@direct pb pa a b int b = 5 ; //@direct pb pa a b
&pb &pa &a &b &pb &pa &a &b
int * pb = &b; //@direct int * pb = &b; //@direct
&b &a
&b 14
? 7 &b &b 14 -7
7
a = 1 ; //@direct a = 1 ; //@direct
pa = &a ; //@direct pa = &a ; //@direct
Fabien Calcado ISTY– IATIC3 - 2020/2021 19 Fabien Calcado ISTY– IATIC3 - 2020/2021 20
5
Les pointeurs Les pointeurs
Les indirections multiples Les indirections multiples
– Un pointeur peut stocker l’adresse d’un autre pointeur – Un pointeur peut stocker l’adresse d’un autre pointeur
• Un déréférencement « * » annule une référence « & » • Un déréférencement « * » annule une référence « & »
int a = 2 ; a a int a = 2 ; a a
int * pa = &a ; int * pa = &a ;
int ** ppa = &pa ; int ** ppa = &pa ;
*(*(ppa))) *(pa) *(*(ppa))) *(pa)
int *** pppa = &ppa ; int *** pppa = &ppa ;
***ppa = **pa + *pa + a ; *(*(*(&ppa))) *(*(&pa)) a ***ppa = **pa + *pa + a ; *(*(*(&ppa))) *(*(&pa)) a
pppa ppa pa *(*(*(pppa))) *(*(ppa)) *(&a) 2 pppa ppa pa *(*(*(pppa))) *(*(ppa)) *(&a) 2
a a
&pppa &ppa &pa &a &pppa &ppa &pa &a
Fabien Calcado ISTY– IATIC3 - 2020/2021 21 Fabien Calcado ISTY– IATIC3 - 2020/2021 22
6
Les pointeurs Les pointeurs
Passage par copie de référence Passage par copie de référence
– Perm et à une fonction d’avoir un effet de bord – Perm et à une fonction d’avoir un effet de bord
• Modification d’une variable en dehors de son environnement local • Modification d’une variable en dehors de son environnement local
v oid f ct( int a , int* p) ; Env. du main Env. de fct v oid f ct( int a , int* p) ; Env. du main Env. de fct
int main(v oid) { a b a p int main(v oid) { a b a p
&a &b &a &p &a &b &a &p
int a=1, b=2; int a=1, b=2;
f ct( a , &b) ; f ct( a , &b) ;
printf (" a=%d, b=%d \n", a, b); 1 2 1 &b printf (" a=%d, b=%d \n", a, b); 1 2 1 &b
return 0; return 0;
} Copie de argument 2 dans paramètre 2
}
v oid f ct( int a , int* p) { Copie de argument 1 dans paramètre 1 v oid f ct( int a , int* p) {
a = 3; a = 3; 3) Exécution du corps de la fonction :
*p = a + 1; 2) Passage par copie : *p = a + 1; - 2 variables dans des environnements différents portant
return; Valeur de « a » (main) copiée dans « a » (fct) return; le même identificateur « a » Adresses différentes
} Valeur « adresse de b » (main) copiée dans « p » (fct) } - « p » pointe sur une variable d’un autre environnement
Fabien Calcado ISTY– IATIC3 - 2020/2021 25 Fabien Calcado ISTY– IATIC3 - 2020/2021 26
7
Les pointeurs Les pointeurs
Passage par copie de référence Passage par copie de référence
– Perm et à une fonction d’avoir un effet de bord – Perm et à une fonction d’avoir un effet de bord
• Modification d’une variable en dehors de son environnement local • Modification d’une variable en dehors de son environnement local
v oid f ct( int a , int* p) ; Env. du main Env. de fct v oid f ct( int a , int* p) ; Env. du main Env. de fct
int main(v oid) { a b a p int main(v oid) { a b a p
&a &b &a &p int a=1, b=2; &a &b &a &p
int a=1, b=2;
f ct( a , &b) ; f ct( a , &b) ;
printf (" a=%d, b=%d \n", a, b); 1 4 3 &b printf (" a=%d, b=%d \n", a, b); 1 4 3 &b
return 0; return 0;
} }
Fabien Calcado ISTY– IATIC3 - 2020/2021 29 Fabien Calcado ISTY– IATIC3 - 2020/2021 30
Fabien Calcado ISTY– IATIC3 - 2020/2021 31 Fabien Calcado ISTY– IATIC3 - 2020/2021 32
8
Les pointeurs Les pointeurs
Fabien Calcado ISTY– IATIC3 - 2020/2021 33 Fabien Calcado ISTY– IATIC3 - 2020/2021 34
Fabien Calcado ISTY– IATIC3 - 2020/2021 35 Fabien Calcado ISTY– IATIC3 - 2020/2021 36
9
Les pointeurs Les pointeurs
int fct( int a , int b) { Fin d’appel à « fct » : int fct( int a , int b) {
int res; int res; On suppose que la valeur de « res » vaut 0xF4A1
2) Destruction des variables locales
res = a + b; res = a + b; Adressage direct sur « res » ok
return &res; Le pointeur « res » du main pointe sur une return &res;
Adressage indirect sur « res » erreur de segmentation
} variable qui n’est plus accessible… }
Fabien Calcado ISTY– IATIC3 - 2020/2021 37 Fabien Calcado ISTY– IATIC3 - 2020/2021 38
10