Post

CM02 Pointeurs

Télécharger le CM02 Pointeurs en pdf

Pages : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74

Page 1 : INFORMATIQUE 2I I . L E S P O I N T E U R SEva ANSERMIN & Romuald GRIGNONv1.00

page 1

Page 2 : •Pourquoi scanf“d”,&a alors que printf“d”,a?•Pourquoi scanf“d”,&c alors que scanf“s”, c?•Comment faire pour retourner plusieurs valeurs depuis une fonction?•Pourquoi les éléments d'un tableau passé en paramètre d’une fonctionsont modifiés et pas les variables « classiques »?Les mystères du CE. ANSERMIN R. GRIGNON2

page 2

Page 3 : •Une variable est stockée dans la RAM de l’ordinateur.•Chaque cellule de la mémoire est designée par une adresse.•Une variable est accessible par son nom.Rappelinta = 2;float b = 10;Adresse Valeur 115411552………10 02810abE. ANSERMIN R. GRIGNON3

page 3

Page 4 : •On peut accéder à l’adresse d’une variable grace à l’opérateur &.•a = &a b= &b Adresse d’une variableinta = 2;float b = 10;Adresse Valeur 115411552………10 02810abE. ANSERMIN R. GRIGNON4

page 4

Page 5 : •On peut accéder à l’adresse d’une variable grace à l’opérateur &.•a = 2 &a 1155 b=10 &b 10 028Adresse d’une variableinta = 2;float b = 10;Adresse Valeur 115411552………10 02810abE. ANSERMIN R. GRIGNON5

page 5

Page 6 : •En pratique :Adresse d’une variable// Programme d'exemple pour afficher// les adresses des variablesint mainint a = 2;int b = 10;printf"a=db=d&a=p&b=p\n", a, b, &a, &b;return 0;E. ANSERMIN R. GRIGNON6

page 6

Page 7 : •En pratique :Adresse d’une variablea=2b=10&a 0x7ffde2010c0c&b 0x7ffde2010c08// Programme d'exemple pour afficher// les adresses des variablesint mainint a = 2;int b = 10;printf"a=db=d&a=p&b=p\n", a, b, &a, &b;return 0;E. ANSERMIN R. GRIGNON7

page 7

Page 8 : •En pratique :•p est le format pour afficher des adresses en hexa-decimal sur 8 octets Adresse d’une variablea=2b=10&a 0x7ffde2010c0c&b 0x7ffde2010c08// Programme d'exemple pour afficher// les adresses des variablesint mainint a = 2;int b = 10;printf"a=db=d&a=p&b=p\n", a, b, &a, &b;return 0;E. ANSERMIN R. GRIGNON8

page 8

Page 9 : int a =2; float b = 10;scanf"d", &a ; Adresse Valeur 115411552………10 02810abAdresse de stockage de la variable saisie au clavier=« mettre la valeur saisie à l’adresse de ‘a’ » Adresse d’une variable : scanfE. ANSERMIN R. GRIGNON9

page 9

Page 10 : Adresse Valeur 115411552………10 02810abAdresse d’une variable : scanfint a =2; float b = 10;scanf"d", &a ;scanf"d",1155;scanf"d", a ;scanf"d",2;abEspace mémoire non autorisé : L’adresse ‘2’ n’est pas accessible par notre programmeerreur de segmentation !E. ANSERMIN R. GRIGNON10

page 10

Page 11 : •Principe : accéder à une variable par son adresse plutôt que par son nom. •Un pointeur est :•Une variable dont la valeur est une adresse mémoire …Les pointeursE. ANSERMIN R. GRIGNON11

page 11

Page 12 : •Principe : accéder à une variable par son adresse plutôt que par son nom. •Un pointeur est :•Une variable dont la valeur est une adresse mémoire …•L’adresse d’une autre variable !Les pointeursAdresse Valeur 115411552………10 0281155apaOn dit que ‘pa’ pointe sur a.E. ANSERMIN R. GRIGNON12

page 12

Page 13 : •Un pointeur peut pointer sur tout type de données entier, reel, autre pointeur ! ….•Il est déclaré avec le caractère .•Un pointeur est déclaré avec le type de la variable sur laquelle il pointe.Les pointeurs : déclaration Type nomPointeur; Type de la variable pointéeNom du pointeurE. ANSERMIN R. GRIGNON13

page 13

Page 14 : Les pointeurs : déclaration Type nomPointeur; Type nomPointeur;Type nomPointeur;ououE. ANSERMIN R. GRIGNON14•Un pointeur peut pointer sur tout type de données entier, reel, autre pointeur ! ….•Il est déclaré avec le caractère .•Un pointeur est déclaré avec le type de la variable sur laquelle il pointe.

page 14

Page 15 : •Exemple :Adresse Valeur 1154???1155…5340???…10 02810 029???……22 222???inta;floatb;intp1; // pointeur sur intfloat p2; // pointeur sur floatap1bp2Les pointeurs : déclaration E. ANSERMIN R. GRIGNON15

page 15

Page 16 : •Exemple :Adresse Valeur 115451155…5340???…10 02810 029???……22 222???inta;floatb;intp1; // pointeur sur intfloat p2; // pointeur sur floata=5;ap1bp2Les pointeurs : déclaration E. ANSERMIN R. GRIGNON16

page 16

Page 17 : •Exemple :Adresse Valeur 115451155…5340???…10 02810 029???……22 2221154inta;floatb;intp1; // pointeur sur intfloat p2; // pointeur sur floata=5;p1=&a; // prend l’adresse de aap1bp2Les pointeurs : déclaration E. ANSERMIN R. GRIGNON17

page 17

Page 18 : •Exemple :Adresse Valeur 115451155…5340???…10 02810 0292,5……22 2221154inta;floatb;intp1; // pointeur sur intfloat p2; // pointeur sur floata=5;p1=&a; // prend l’adresse de ab=2.5;ap1bp2Les pointeurs : déclaration E. ANSERMIN R. GRIGNON18

page 18

Page 19 : •Exemple :Adresse Valeur 115451155…534010 029…10 02810 0292,5……22 2221154inta;floatb;intp1; // pointeur sur intfloat p2; // pointeur sur floata=5;p1=&a; // prend l’adresse de ab=2.5;p2=&b //prend l’adresse de bap1bp2Les pointeurs : déclaration E. ANSERMIN R. GRIGNON19

page 19

Page 20 : •Exemple :Adresse Valeur 115451155…534010 029…10 02810 0292,5……22 2221154inta;floatb;intp1; // pointeur sur intfloat p2; // pointeur sur floata=5;p1=&a; // prend l’adresse de ab=2.5;p2=&b //prend l’adresse de bap1bp2Les pointeurs : déclaration p1 pointe sur ap2 pointe sur bE. ANSERMIN R. GRIGNON20

page 20

Page 21 : Les pointeurs : initialisation •Pour initialiser un pointeur indiquer qu’il ne pointe sur aucune variable, on utilise le mot clef NULL cette constante indique la valeur 0.Type nomPointeur = NULL; //on pointe à l’adresse 0 E. ANSERMIN R. GRIGNON21

page 21

Page 22 : Les pointeurs : initialisation •Pour initialiser un pointeur indiquer qu’il ne pointe sur aucune variable, on utilise le mot clef NULL cette constante indique la valeur 0.Type nomPointeur = NULL; //on pointe à l’adresse 0 ⚠️Il est important d’initialiser les pointeurs ⚠️pour ne pas risquer de modifier un espace mémoire accessible par erreurE. ANSERMIN R. GRIGNON22

page 22

Page 23 : Les pointeurs : initialisation •Pour initialiser un pointeur indiquer qu’il ne pointe sur aucune variable, on utilise le mot clef NULL cette constante indique la valeur 0.Type nomPointeur = NULL; //on pointe à l’adresse 0 ⚠️Il est important d’initialiser les pointeurs ⚠️pour ne pas risquer de modifier un espace mémoire accessible par erreur.⚠️Mettre la valeur NULL permet de forcer le pointeur ⚠️à accéder à l’adresse 0 et donc de créer une erreur de segmentation si on l’utilise tel quel.E. ANSERMIN R. GRIGNON23

page 23

Page 24 : Les pointeurs : utilisation •Un pointeur permet d’accéder à une variable via son adresse.•Le caractère permet d’accéder à la variable pointée par le pointeur. Sa signification est « ce qui est contenu dans l’adresse ».•Exemple :inta;intp1; // pointeur sur inta= 5;p1 = &a;// prend l'adresse de aprintf" a =d \n",a;printf"p1=p \n",p1;p1 = 10;printf" a =d \n",a;E. ANSERMIN R. GRIGNON24

page 24

Page 25 : Les pointeurs : utilisation •Un pointeur permet d’accéder à une variable via son adresse.•Le caractère permet d’accéder à la variable pointée par le pointeur. Sa signification est « ce qui est contenu dans l’adresse ».•Exemple : inta;intp1; // pointeur sur inta= 5;p1 = &a;// prend l'adresse de aprintf" a =d \n",a;printf"p1=d \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 1154???1155…5340…10 02810 029???……22 222E. ANSERMIN R. GRIGNON25

page 25

Page 26 : Les pointeurs : utilisation •Un pointeur permet d’accéder à une variable via son adresse.•Le caractère permet d’accéder à la variable pointée par le pointeur. Sa signification est « ce qui est contenu dans l’adresse ».•Exemple : inta;intp1; // pointeur sur inta= 5;p1 = &a;// prend l'adresse de aprintf" a =d \n",a;printf"p1=d \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 1154???1155…5340…10 02810 029???……22 222aE. ANSERMIN R. GRIGNON26

page 26

Page 27 : Les pointeurs : utilisation •Un pointeur permet d’accéder à une variable via son adresse.•Le caractère permet d’accéder à la variable pointée par le pointeur. Sa signification est « ce qui est contenu dans l’adresse ».•Exemple :inta;intp1; // pointeur sur inta= 5;p1 = &a;// prend l'adresse de aprintf" a =d \n",a;printf"p1=d \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 1154???1155…5340…10 02810 029???……22 222ap1E. ANSERMIN R. GRIGNON27

page 27

Page 28 : Les pointeurs : utilisation •Un pointeur permet d’accéder à une variable via son adresse.•Le caractère permet d’accéder à la variable pointée par le pointeur. Sa signification est « ce qui est contenu dans l’adresse ».•Exemple : inta;intp1; // pointeur sur inta= 5;p1 = &a;// prend l'adresse de aprintf" a =d \n",a;printf"p1=d \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 115451155…5340…10 02810 029???……22 222ap1E. ANSERMIN R. GRIGNON28

page 28

Page 29 : Les pointeurs : utilisation •Un pointeur permet d’accéder à une variable via son adresse.•Le caractère permet d’accéder à la variable pointée par le pointeur. Sa signification est « ce qui est contenu dans l’adresse ».•Exemple : inta;intp1; // pointeur sur inta= 5;p1 = &a;// prend l'adresse de aprintf" a =d \n",a;printf"p1=d \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 115451155…5340…10 02810 0291154……22 222ap1E. ANSERMIN R. GRIGNON29

page 29

Page 30 : Les pointeurs : utilisation •Un pointeur permet d’accéder à une variable via son adresse.•Le caractère permet d’accéder à la variable pointée par le pointeur. Sa signification est « ce qui est contenu dans l’adresse »•Exemple :inta;intp1; // pointeur sur inta= 5;p1 = &a;// prend l'adresse de aprintf" a =d \n",a;printf"p1=d \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 115451155…5340…10 02810 0291154……22 222ap1a=5E. ANSERMIN R. GRIGNON30

page 30

Page 31 : Les pointeurs : utilisation •Un pointeur permet d’accéder à une variable via son adresse.•Le caractère permet d’accéder à la variable pointée par le pointeur. Sa signification est « ce qui est contenu dans l’adresse ».•Exemple : inta;intp1; // pointeur sur inta= 5;p1 = &a;// prend l'adresse de aprintf" a =d \n",a;printf"p1=d \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 115451155…5340…10 02810 0291154……22 222ap1a=5p1=5E. ANSERMIN R. GRIGNON31

page 31

Page 32 : Les pointeurs : utilisation •Un pointeur permet d’accéder à une variable via son adresse.•Le caractère permet d’accéder à la variable pointée par le pointeur. Sa signification est « ce qui est contenu dans l’adresse ».•Exemple :inta;intp1; // pointeur sur inta= 5;p1 = &a;// prend l'adresse de aprintf" a =d \n",a;printf"p1=d \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 1154101155…5340…10 02810 0291154……22 222ap1a=5p1=5E. ANSERMIN R. GRIGNON32

page 32

Page 33 : Les pointeurs : utilisation •Un pointeur permet d’accéder à une variable via son adresse•Le caractère permet d’accéder à la variable pointée par le pointeur. Sa signification est « ce qui est contenu dans l’adresse »•Exemple :inta;intp1; // pointeur sur inta= 5;p1 = &a;// prend l'adresse de aprintf" a =d \n",a;printf"p1=d \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 1154101155…5340…10 02810 0291154……22 222ap1a=5p1=5a=10E. ANSERMIN R. GRIGNON33

page 33

Page 34 : Les pointeurs : utilisation •Exercice :Adresse Valeur 11541155…5340…10 02810 029……22 222inta;floatb;intp1;float p2;a= 5;p1= &a;b= 2.5;p2= &b;p1 = 4;b= 0.3;Quelle est la valeur des variables suivantes ? a=p1=p1=b=p2=p2= E. ANSERMIN R. GRIGNON34

page 34

Page 35 : Les pointeurs : utilisation Adresse Valeur 11541155…5340…10 02810 029……22 222inta;floatb;intp1;float p2;a= 5;p1= &a;b= 2.5;p2= &b;p1 = 4;b= 0.3;Quelle est la valeur des variables suivantes ? a=4p1=p1=b=p2=p2= E. ANSERMIN R. GRIGNON35•Exercice :

page 35

Page 36 : Les pointeurs : utilisation Adresse Valeur 11541155…5340…10 02810 029……22 222inta;floatb;intp1;float p2;a= 5;p1= &a;b= 2.5;p2= &b;p1 = 4;b= 0.3;Quelle est la valeur des variables suivantes ? a=4p1=&ap1=b=p2=p2= E. ANSERMIN R. GRIGNON36•Exercice :

page 36

Page 37 : Les pointeurs : utilisation Adresse Valeur 11541155…5340…10 02810 029……22 222inta;floatb;intp1;float p2;a= 5;p1= &a;b= 2.5;p2= &b;p1 = 4;b= 0.3;Quelle est la valeur des variables suivantes ? a=4p1=&ap1=4b=p2=p2= E. ANSERMIN R. GRIGNON37•Exercice :

page 37

Page 38 : Les pointeurs : utilisation •Exercice :Adresse Valeur 11541155…5340…10 02810 029……22 222inta;floatb;intp1;float p2;a= 5;p1= &a;b= 2.5;p2= &b;p1 = 4;b= 0.3;Quelle est la valeur des variables suivantes ? a=4p1=&ap1=4b=0.3p2=p2= E. ANSERMIN R. GRIGNON38

page 38

Page 39 : Les pointeurs : utilisation Adresse Valeur 11541155…5340…10 02810 029……22 222inta;floatb;intp1;float p2;a= 5;p1= &a;b= 2.5;p2= &b;p1 = 4;b= 0.3;Quelle est la valeur des variables suivantes ? a=4p1=&ap1=4b=0.3p2=&bp2= E. ANSERMIN R. GRIGNON39•Exercice :

page 39

Page 40 : Les pointeurs : utilisation Adresse Valeur 11541155…5340…10 02810 029……22 222inta;floatb;intp1;float p2;a= 5;p1= &a;b= 2.5;p2= &b;p1 = 4;b= 0.3;Quelle est la valeur des variables suivantes ? a=4p1=&ap1=4b=0.3p2=&bp2=0.3E. ANSERMIN R. GRIGNON40•Exercice :

page 40

Page 41 : Les pointeurs : utilisation •Objectif : écrire une fonction qui échange deux valeurs passées en paramètre.int switchint a, int bint tmp;tmp=a;a=b;b=tmp;returna;returnb;E. ANSERMIN R. GRIGNON41

page 41

Page 42 : Les pointeurs : utilisation •Objectif : écrire une fonction qui échange deux valeurs passées en paramètre.int switchint a, int bint tmp;tmp=a;a=b;b=tmp;returna;returnb;On ne peut pas retourner deux valeurs !Comment faire ?E. ANSERMIN R. GRIGNON42

page 42

Page 43 : Les pointeurs : utilisation •Objectif : écrire une fonction qui échange deux valeurs passées en paramètre.•Rappel : ce qui se passe en mémoireint switchint a, int bint tmp;tmp=a;a=b;b=tmp;returna;int mainint x=3;int y=4;int z=switchx,y;return 0;Adresse Valeur 11541158115C…5340…10 02810 02C10 030…22 222E. ANSERMIN R. GRIGNON43

page 43

Page 44 : Les pointeurs : utilisation •Objectif : écrire une fonction qui échange deux valeurs passées en paramètre.•Rappel : ce qui se passe en mémoireint switchint a, int bint tmp;tmp=a;a=b;b=tmp;returna;int mainint x=3;int y=4;int z=switchx,y;return 0;Adresse Valeur 115431158115C…5340…10 02810 02C10 030…22 222xE. ANSERMIN R. GRIGNON44

page 44

Page 45 : Les pointeurs : utilisation •Objectif : écrire une fonction qui échange deux valeurs passées en paramètre.•Rappel : ce qui se passe en mémoire.int switchint a, int bint tmp;tmp=a;a=b;b=tmp;returna;int mainint x=3;int y=4;int z=switchx,y;return 0;Adresse Valeur 1154311584115C…5340…10 02810 02C10 030…22 222xyE. ANSERMIN R. GRIGNON45

page 45

Page 46 : Les pointeurs : utilisation •Objectif : écrire une fonction qui échange deux valeurs passées en paramètre.•Rappel : ce qui se passe en mémoire.int switchint a, int bint tmp;tmp=a;a=b;b=tmp;returna;int mainint x=3;int y=4;int z=switchx,y;return 0;Adresse Valeur 1154311584115C…5340…10 028310 02C410 030…22 222xyabLes valeurs des variables passées en paramètres sont copiées : c’est un passage par valeurE. ANSERMIN R. GRIGNON46

page 46

Page 47 : Les pointeurs : utilisation int switchint a, int bint tmp;tmp=a;a=b;b=tmp;returna;int mainint x=3;int y=4;int z=switchx,y;return 0;Adresse Valeur 1154311584115C…5340…10 028310 02C410 030…22 222xyabtmpE. ANSERMIN R. GRIGNON47•Objectif : écrire une fonction qui échange deux valeurs passées en paramètre.•Rappel : ce qui se passe en mémoire.

page 47

Page 48 : Les pointeurs : utilisation int switchint a, int bint tmp;tmp=a;a=b;b=tmp;returna;int mainint x=3;int y=4;int z=switchx,y;return 0;Adresse Valeur 1154311584115C…5340…10 028310 02C410 0303…22 222xyabtmpE. ANSERMIN R. GRIGNON48•Objectif : écrire une fonction qui échange deux valeurs passées en paramètre.•Rappel : ce qui se passe en mémoire.

page 48

Page 49 : Les pointeurs : utilisation int switchint a, int bint tmp;tmp=a;a=b;b=tmp;returna;int mainint x=3;int y=4;int z=switchx,y;return 0;Adresse Valeur 1154311584115C…5340…10 028410 02C410 0303…22 222xyabtmpModifier a ne modifie pas x : les variables sont décorréléesE. ANSERMIN R. GRIGNON49•Objectif : écrire une fonction qui échange deux valeurs passées en paramètre.•Rappel : ce qui se passe en mémoire.

page 49

Page 50 : Les pointeurs : utilisation int switchint a, int bint tmp;tmp=a;a=b;b=tmp;returna;int mainint x=3;int y=4;int z=switchx,y;return 0;Adresse Valeur 1154311584115C…5340…10 028410 02C310 0303…22 222xyabtmpE. ANSERMIN R. GRIGNON50•Objectif : écrire une fonction qui échange deux valeurs passées en paramètre.•Rappel : ce qui se passe en mémoire.

page 50

Page 51 : Les pointeurs : utilisation int switchint a, int bint tmp;tmp=a;a=b;b=tmp;returna;int mainint x=3;int y=4;int z=switchx,y;return 0;Adresse Valeur 1154311584115C…5340…10 028410 02C310 0303…22 2224xyabtmpzE. ANSERMIN R. GRIGNON51•Objectif : écrire une fonction qui échange deux valeurs passées en paramètre.•Rappel : ce qui se passe en mémoire.

page 51

Page 52 : Les pointeurs : utilisation •Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.•Par conséquent, la valeur de retour devient inutile : on utilise une procédure.void switchint pa, int pbint tmp;tmp=pa;pa=pb;pb=tmp;int mainint x=3;int y=4;switch&x,&y;return 0;E. ANSERMIN R. GRIGNON52

page 52

Page 53 : Les pointeurs : utilisation void switchint pa, int pbint tmp;tmp=pa;pa=pb;pb=tmp;int mainint x=3;int y=4;switch&x,&y;return 0;AdresseValeur11541158115C…5340…10 02810 02C10 030…22 222E. ANSERMIN R. GRIGNON53•Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.•Par conséquent, la valeur de retour devient inutile : on utilise une procédure.

page 53

Page 54 : Les pointeurs : utilisation void switchint pa, int pbint tmp;tmp=pa;pa=pb;pb=tmp;int mainint x=3;int y=4;switch&x,&y;return 0;AdresseValeur115431158115C…5340…10 02810 02C10 030…22 222xE. ANSERMIN R. GRIGNON54•Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.•Par conséquent, la valeur de retour devient inutile : on utilise une procédure.

page 54

Page 55 : Les pointeurs : utilisation void switchint pa, int pbint tmp;tmp=pa;pa=pb;pb=tmp;int mainint x=3;int y=4;switch&x,&y;return 0;AdresseValeur1154311584115C…5340…10 02810 02C10 030…22 222xyE. ANSERMIN R. GRIGNON55•Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.•Par conséquent, la valeur de retour devient inutile : on utilise une procédure.

page 55

Page 56 : Les pointeurs : utilisation void switchint pa, int pbint tmp;tmp=pa;pa=pb;pb=tmp;int mainint x=3;int y=4;switch&x,&y;return 0;AdresseValeur1154311584115C…5340…10 02810 02C10 030…22 222xypapbE. ANSERMIN R. GRIGNON56•Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.•Par conséquent, la valeur de retour devient inutile : on utilise une procédure.

page 56

Page 57 : Les pointeurs : utilisation void switchint pa, int pbint tmp;tmp=pa;pa=pb;pb=tmp;int mainint x=3;int y=4;switch&x,&y;return 0;AdresseValeur1154311584115C…5340…10 028115410 02C115810 030…22 222xypapbE. ANSERMIN R. GRIGNON57•Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.•Par conséquent, la valeur de retour devient inutile : on utilise une procédure.

page 57

Page 58 : Les pointeurs : utilisation void switchint pa, int pbint tmp;tmp=pa;pa=pb;pb=tmp;int mainint x=3;int y=4;switch&x,&y;return 0;AdresseValeur1154311584115C…5340…10 028115410 02C115810 030…22 222xypapbtmpE. ANSERMIN R. GRIGNON58•Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.•Par conséquent, la valeur de retour devient inutile : on utilise une procédure.

page 58

Page 59 : Les pointeurs : utilisation void switchint pa, int pbint tmp;tmp=pa;pa=pb;pb=tmp;int mainint x=3;int y=4;switch&x,&y;return 0;AdresseValeur1154311584115C…5340…10 028115410 02C115810 0303…22 222xypapbtmpOn accède à la valeur de a via son adresse.E. ANSERMIN R. GRIGNON59•Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.•Par conséquent, la valeur de retour devient inutile : on utilise une procédure.

page 59

Page 60 : Les pointeurs : utilisation void switchint pa, int pbint tmp;tmp=pa;pa=pb;pb=tmp;int mainint x=3;int y=4;switch&x,&y;return 0;AdresseValeur1154411584115C…5340…10 028115410 02C115810 0303…22 222xypapbtmp« la valeur de la variable pointée par pa = la valeur de la variable pointée par pb »E. ANSERMIN R. GRIGNON60•Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.•Par conséquent, la valeur de retour devient inutile : on utilise une procédure.

page 60

Page 61 : Les pointeurs : utilisation void switchint pa, int pbint tmp;tmp=pa;pa=pb;pb=tmp;int mainint x=3;int y=4;switch&x,&y;return 0;AdresseValeur1154411583115C…5340…10 028115410 02C115810 0303…22 222xypapbtmpOn modifie la valeur des variables via leur adresse. E. ANSERMIN R. GRIGNON61•Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.•Par conséquent, la valeur de retour devient inutile : on utilise une procédure.

page 61

Page 62 : Les pointeurs : utilisation void switchint pa, int pbint tmp;tmp=pa;pa=pb;pb=tmp;int mainint x=3;int y=4;switch&x,&y;return 0;AdresseValeur1154411583115C…5340…10 028115410 02C115810 0303…22 222xypapbtmpPas besoin de return !E. ANSERMIN R. GRIGNON62•Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.•Par conséquent, la valeur de retour devient inutile : on utilise une procédure.

page 62

Page 63 : Le passage par adresse•Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.•La fonction/procédure prends donc des adresses en arguments, soit des types pointeurs.•Une variable dont l’adresse passée est modifiable dans la fonction.•C’est le passage par adresse en opposition au passage par valeur.•C’est le seul moyen en langage C pour permettre à deux fonctions de partagerle même espace mémoire.type nomFonctionint arg1, float arg2, …E. ANSERMIN R. GRIGNON63

page 63

Page 64 : Tableaux et pointeurs•Rappel : les valeurs d’un tableau sont à la suite dans la mémoire. Adresse Valeur 115413000…………22 222int mainint tab5=1,3return 0;tab0tab1tab2tab3tab4E. ANSERMIN R. GRIGNON64

page 64

Page 65 : Tableaux et pointeurs•Rappel : les valeurs d’un tableau sont à la suite dans la mémoire.•Lorsqu’un tableau est déclaré :•Un espace mémoire de la bonne taille est réservé•Un pointeur constant en lecture seule portant le nom du tableau est crée.Il pointe sur la première case du tableau. Adresse Valeur 115413000…………22 2221154int mainint tab5=1,3return 0;tab0tab1tab2tab3tab4tabE. ANSERMIN R. GRIGNON65

page 65

Page 66 : Tableaux et pointeurs•Rappel : les valeurs d’un tableau sont à la suite dans la mémoire.•Lorsqu’un tableau est déclaré :•Un espace mémoire de la bonne taille est réservé•Un pointeur constant en lecture seule portant le nom du tableau est crée.Il pointe sur la première case du tableau. •Manipuler un tableau revient à utiliser un pointeur. On accéde à ses élément par adresse.•On a l’équivalence suivante :tabi ⇔tab+iE. ANSERMIN R. GRIGNON66

page 66

Page 67 : Tableaux et pointeurs•On a l’équivalence suivante :•Illustration : tabi ⇔tab+iAdresseValeur1154 = tab+013000…………22 2221154tab0tabE. ANSERMIN R. GRIGNON67

page 67

Page 68 : Tableaux et pointeurs•La manipulation d’un tableau peut donc se faire en formalisme tableau avec les caractères ou en formalisme pointeur, avec l’opérateur .define TAILLE 20int mainint i;int tabTAILLE=0;fori=0;iTAILLE;i++tabi=10;return 0;define TAILLE 20int mainint i;int tabTAILLE=0;fori=0;iTAILLE;i++tab+i=10;return 0;E. ANSERMIN R. GRIGNON68

page 68

Page 69 : Tableaux et pointeurs•Exercice : quel résultat donne l’instruction en rouge ? define TAILLE 20int mainint tab1TAILLE=0;int tab2TAILLE=0;forint i=0;iTAILLE;i++tab1i=i;tab2=tab1;return 0; Adresse Valeur 1154…5340………22 222…30 000E. ANSERMIN R. GRIGNON69

page 69

Page 70 : Tableaux et pointeurs•Exercice : quel résultat donne l’instruction en rouge ? define TAILLE 20int mainint tab1TAILLE=0;int tab2TAILLE=0;forint i=0;iTAILLE;i++tab1i=i;tab2=tab1;return 0; Adresse Valeur 1154…5340………22 222…30 000Les tableaux déclarés statiquement sont des pointeurs en lecture seule : Impossible d’écrire tab2 = ….E. ANSERMIN R. GRIGNON70

page 70

Page 71 : Tableaux et pointeurs•Exercice : pourquoi écrit-on :•scanf"c", &nom pour un caractère ?•scanf"s", nom pour une chaîne de caractères ?E. ANSERMIN R. GRIGNON71

page 71

Page 72 : Tableaux et pointeurs•Exercice : pourquoi écrit-on :•scanf"c", &nom pour un caractère ?•scanf"s", nom pour une chaîne de caractères ?•Car une chaine de caractère est un tableau !•« nom » est donc un pointeur l’adresse de la première case de la chaîne de caractères.E. ANSERMIN R. GRIGNON72

page 72

Page 73 : Tableaux, pointeurs et fonctions•Le passage d’un tableau en paramètre d’une fonction se fait donc par adresse. On a l’équivalence :•Un tableau, déclaré dans une fonction appelante et, passé en paramètre lors d'un appel, peut être modifié dans la fonction appelée.•Cela permet donc à 2 fonctions qui possèdent des contextes mémoires séparés de partager un même espace mémoire.type nomFonctionint tab, int taille …type nomFonctionint tab, int taille…⇔E. ANSERMIN R. GRIGNON73

page 73

Page 74 : Conclusion•Un pointeur est une variable contenant une adresse. Il se déclare avec le type de la variable sur laquelle il pointe. •Le caractère « » associé au pointeur permet d’avoir accès à la variable pointée. On peut la modifier, l’afficher… On peut accéder alors à cette variable par son adresse plutôt que par son nom.•Les utilités des pointeurs sont nombreuses : ils permettent de modifier par adresse des variables dans d’autres fonctions et sont à la base de la gestion des tableaux. Plus d’infos au prochain cours!•Il est important de comprendre le fonctionnement de la mémoire pour pouvoir utiliser correctement les pointeurs !•Des lacunes sur ce chapitre pourraient se répercuter sur l’ensemble des coursqui sont basés sur le langage C.E. ANSERMIN R. GRIGNON74

page 74

Pages : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74

Le contenu de cet article est la propriété exclusive de son auteur.