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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 67 : Tableaux et pointeurs•On a l’équivalence suivante :•Illustration : tabi ⇔tab+iAdresseValeur1154 = tab+013000…………22 2221154tab0tabE. ANSERMIN R. GRIGNON67
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 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 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 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 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 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 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
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