CM02 Pointeur
Télécharger le CM02 Pointeur 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
Page 1 : INFORMATIQUE 2I I . L E S P O I N T E U R S
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 C
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 nomRappelinta = 2;float b = 10;Adresse Valeur 115411552………10 02810ab
Page 4 : •On peut acceder à l’adresse d’une variable grace à &•a = 2 &a = 1155 b=10 &b=10 028Adresse d’une variableinta = 2;float b = 10;Adresse Valeur 115411552………10 02810ab
Page 5 : •On peut acceder à l’adresse d’une variable grace à &•a = 2 &a = 1155 b=10 &b=10 028Adresse d’une variableinta = 2;float b = 10;Adresse Valeur 115411552………10 02810ab
Page 6 : •En pratiqueAdresse 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;
Page 7 : •En pratiqueAdresse 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;a=2b=10&a=0x7ffde2010c0c&b=0x7ffde2010c08
Page 8 : •En pratique•p est le format pour afficher des adresses en hexa-decimal 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;a=2b=10&a=0x7ffde2010c0c&b=0x7ffde2010c08
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 &a » Adresse d’une variable: scanf
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é : erreur de segmentation !
Page 11 : • Principe : accéder à une variable par son adresse plutôt que par son nom. • Un pointeur est :• Une variable donr la valeur est une adresse mémoire …Les pointeurs
Page 12 : • Principe : accéder à une variable par son adresse plutôt que par son nom. • Un pointeur est :• Une variable donr 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.
Page 13 : •Un pointeur peut pointer sur tout type de données entier, reel, autrepointeur ! …•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 pointeur
Page 14 : •Un pointeur peut pointer sur tout type de données entier, reel, autrepointeur ! …•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 nomPointeur;Type nomPointeur;ouou
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
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
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
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
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
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 b
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 0Type nomPointeur = NULL; //on pointe à l’adresse 0 ⚠️Il est important d’initialiser les pointeurs ⚠️pour ne pas risquer de modifier un espace mémoire interdit
Page 22 : 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;
Page 23 : 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;Adresse Valeur 1154???1155…5340…10 02810 029???……22 222
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;Adresse Valeur 1154???1155…5340…10 02810 029???……22 222a
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=p \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 1154???1155…5340…10 02810 029???……22 222ap1
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=p \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 115451155…5340…10 02810 029???……22 222ap1
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=p \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 115451155…5340…10 02810 0291154……22 222ap1
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=p \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 115451155…5340…10 02810 0291154……22 222ap1a=5
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=p \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 115451155…5340…10 02810 0291154……22 222ap1a=5p1=5
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=p \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 1154101155…5340…10 02810 0291154……22 222ap1a=5p1=5
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=p \n",p1;p1 = 10;printf" a =d \n",a;Adresse Valeur 1154101155…5340…10 02810 0291154……22 222ap1a=5p1=5a=10
Page 32 : 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 =
Page 33 : 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= 4 p1= &a p1 = 4b= 0,3 p2 =&b p2 = 0,3
Page 34 : 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;
Page 35 : 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 ?
Page 36 : 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 222
Page 37 : 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 222x
Page 38 : 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 1154311584115C…5340…10 02810 02C10 030…22 222xy
Page 39 : 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 1154311584115C…5340…10 028310 02C410 030…22 222xyabLes valeurs des variables passées en paramètres sont copiées: c’est un passage par valeur
Page 40 : 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 1154311584115C…5340…10 028310 02C410 030…22 222xyabtmp
Page 41 : 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 1154311584115C…5340…10 028310 02C410 0303…22 222xyabtmp
Page 42 : 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 1154311584115C…5340…10 028410 02C410 0303…22 222xyabtmpModifier a ne modifie pas x: les variables sont décorrélées
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 1154311584115C…5340…10 028410 02C310 0303…22 222xyabtmp
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 1154311584115C…5340…10 028410 02C310 0303…22 2224xyabtmpz
Page 45 : Les pointeurs : utilisation • Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.void switchint pa, int pbint tmp;tmp=pa;pa=pb;pb=tmp;int mainint x=3;int y=4;switch&x,&y;return 0;
Page 46 : Les pointeurs : utilisation • Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.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 222
Page 47 : Les pointeurs : utilisation • Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.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 222x
Page 48 : Les pointeurs : utilisation • Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.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 222xy
Page 49 : Les pointeurs : utilisation • Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.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 222xypapb
Page 50 : Les pointeurs : utilisation • Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.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 222xypapb
Page 51 : Les pointeurs : utilisation • Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.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 222xypapbtmp
Page 52 : Les pointeurs : utilisation • Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.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
Page 53 : Les pointeurs : utilisation • Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.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 »
Page 54 : Les pointeurs : utilisation • Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.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
Page 55 : Les pointeurs : utilisation • Principe : passer en argument d’une fonction des adresses plutôt que des valeurs.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 !
Page 56 : 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é est modifiable dans la fonction.• C’est le passage par adresse en opposition au passage par valeur.type nomFonctionint arg1, float arg2, …
Page 57 : 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;tab0tab1tab2tab3tab4
Page 58 : 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;tab0tab1tab2tab3tab4tab
Page 59 : 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+i
Page 60 : Tableaux et pointeurs• On a l’équivalence suivante :• Illustration : tabi ⇔tab+iAdresseValeur1154 = tab+013000…………22 2221154tab0tab
Page 61 : Tableaux et pointeurs• La manipulation d’un tableau peut donc se faire en formalisme tableau avec les caractères ou en formalisme pointeur.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;
Page 62 : Tableaux et pointeurs• Exercice : quel résultat donne les commandes en rouges ? define TAILLE 20int mainint tab1TAILLE=0;int tab2TAILLE=0;forint i=0;iTAILLE;i++tab1i=i;tab2=tab1;tab210=0;return 0; Adresse Valeur 1154…5340………22 222…30 000
Page 63 : Tableaux et pointeurs• Exercice : quel résultat donne les commandes en rouges ? define TAILLE 20int mainint tab1TAILLE=0;int tab2TAILLE=0;forint i=0;iTAILLE;i++tab1i=i;tab2=tab1;tab210=0;return 0; Adresse Valeur 1154…5340………22 222…30 000On égalise les pointeurs et donc tab2= adresse de tab10tab2 pointe sur le 1 er tableau - le second tableau n’est plus accessible.
Page 64 : Tableaux et pointeurs•Exercice : pourquoi écrit-on :•scanf"c", &nom pour un caractère ?•scanf"s", nom pour une chaîne de caractère ?
Page 65 : Tableaux et pointeurs•Exercice : pourquoi écrit-on :•scanf"c", &nom pour un caractère ?•scanf"s", nom pour une chaîne de caractère ?•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ère
Page 66 : 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…⇔
Page 67 : 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é. On peut la modifier, l’afficher… On accéder alors à cette variable par adresse plutôt que pas son nom.•Les utilités des pointeurs sont nombreuses: ils permettent de modifier par adresse des variable dans des fonctions ou sont à la base de la gestion des tableaux. Plus d’info au prochain cours!•Il est important de comprendre le fonctionnement de la mémoire pour pouvoir utiliser correctement les pointeurs!
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