Download - Pointeurs : gestion dynamique de la memoire´
![Page 1: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/1.jpg)
Pointeurs : gestion dynamique de la memoire1
Salem BENFERHAT
Centre de Recherche en Informatique de Lens (CRIL-CNRS)email : [email protected]
1Version preliminaire du cours. Tout retour sur la forme comme sur le fond est le bienvenu.
1 / 111
![Page 2: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/2.jpg)
Variables, typesespaces memoire et adresses
2 / 111
![Page 3: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/3.jpg)
Les variables ...
Types• Les langages de programmation permettent de decrire des
donnees de natures et complexites differentes en utilisant lanotion de type
• Des exemples de type de base en langage C sont :
CharIntunsigned intShortLongunsigned longfloatdoublelong double
3 / 111
![Page 4: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/4.jpg)
Les variables ...
Les variables• A chaque fois qu’une variable de type T (de base ou complexe)
est declaree un espace memoire lui est reserve.• En langage C, la commande sizeof permet de connaıtre l’espace
memoire associe a chaque type.
4 / 111
![Page 5: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/5.jpg)
Taille des donnees
1 void taille_des_types ()2 {3 printf ("char = %lu byte\n", sizeof(char));4 printf ("short = %lu bytes\n", sizeof(short));5 printf ("int = %lu bytes\n", sizeof(int));6 printf ("unsigned int = %lu bytes\n",sizeof(unsigned int));7 printf ("long = %lu bytes\n", sizeof(long));8 printf ("unsigned long = %lu bytes\n",sizeof(unsigned long));9 printf ("float = %lu bytes \n", sizeof(float));
10 printf ("double = %lu bytes\n", sizeof(double));11 printf ("long double = %lu bytes\n", sizeof(long double));12 }
5 / 111
![Page 6: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/6.jpg)
Espace memoire pour les variables
Espace memoireL’execution du programme donne l’espace memoire qui sera reservepour chaque type :
char = 1 byteshort = 2 bytesint = 4 bytesunsigned int = 4 byteslong = 8 bytesunsigned long = 8 bytesfloat = 4 bytesdouble = 8 byteslong double = 16 bytes
6 / 111
![Page 7: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/7.jpg)
Adresse
Emplacement des donnees• Les programmes, les fonctions, les variables et les donnees sont
stockes en memoire.• La memoire peut-etre vue comme un grand tableau ou chaque
case contient generalement un mot memoire.• Les indices de ce tableau sont appeles des adresses.• On accede aux informations grace a ces adresses.
L’operateur &L’operateur &, applique a une variable ou a une fonction, permet derecuperer l’adresse de la variable ou de la fonction.
7 / 111
![Page 8: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/8.jpg)
Exemple sur l’operateur &
Adresse des variablesGrace a l’operateur &, on peut recuperer les adresses des variableslocales et parametres utilises dans la fonction Estpremiernaif.
12 int Estpremiernaif( int n)3 {4 int i;5 if( n <= 1) return 0;6 printf ("Dans la fonction Estpremiernaif :\n");7 printf ("la variable n se trouve a l’adresse %p :\n", &n);8 printf ("la variable local i se trouve a l’adresse %p :\n", &i);9 for(i = 2; i <= n; ++i)
10 {11 if(n % i == 0) return 0;12 }13 return 1;14 }
8 / 111
![Page 9: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/9.jpg)
Exemple sur l’operateur &
Adresse• L’execution de la fonction donne :
Dans la fonction Estpremiernaif :
la variable n se trouve a l’adresse : 0x7fff61f5cb2cla variable local i se trouve a l’adresse : 0x7fff61f5cb20
• Les adresses sont donnees en hexadecimal
9 / 111
![Page 10: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/10.jpg)
Exemple sur l’operateur & (suite)
Adresse des variablesGrace a l’operateur &, on peut egalement recuperer les adresses desfonctions.
123 int main ()4 {5 int nombre;6 printf ("Introduire un nombre : ");7 scanf ("%d", &nombre);8 printf ("l\’adresse de la variable nombre est : %p \n", &nombre);9 printf ("l\’adresse de la fonction Estpremiernaif est : %p \n",
10 &Estpremiernaif);11 printf ("l\’adresse de la fonction main est : %p \n", &main);12 if (Estpremiernaif(nombre)==1)13 printf ("Le nombre %d est premier : ", nombre);14 else printf ("Le nombre %d n est pas premier : ", nombre);15 return(0);16 }
10 / 111
![Page 11: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/11.jpg)
Exemple sur l’operateur & (suite)
L’adresse• L’execution de la fonction donne :
l’adresse de la variable nombre est : 0x7fff6d03db44l’adresse de la fonction Estpremiernaif est : 0x10d43eba0l’adresse de la fonction main est : 0x10d43ec50
Remarque• La variable nombre utilisee dans le programme principal et le
parametre n de la fonction Estpremiernaif n’ont pas la memeadresse.
• De ce fait, toute modification sur n n’affectera pas la variablenombre.
11 / 111
![Page 12: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/12.jpg)
Exemple sur l’operateur & (suite)
L’adresse• L’execution de la fonction donne :
l’adresse de la variable nombre est : 0x7fff6d03db44l’adresse de la fonction Estpremiernaif est : 0x10d43eba0l’adresse de la fonction main est : 0x10d43ec50
Remarque• La variable nombre utilisee dans le programme principal et le
parametre n de la fonction Estpremiernaif n’ont pas la memeadresse.
• De ce fait, toute modification sur n n’affectera pas la variablenombre.
11 / 111
![Page 13: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/13.jpg)
Gestion dynamique de la memoire
Pointeur• Pour manipuler les adresses memoire nous avons besoin de
variables particulieres appelees pointeurs.
• Un pointeur est donc une variable qui contient l’adresse d’unedonnee contenue en memoire.
• Un pointeur aura une valeur entiere (qui represente une adressememoire).
• Grace aux pointeurs, on separe le contenu (une valeur) ducontenant (une adresse).
12 / 111
![Page 14: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/14.jpg)
Gestion dynamique de la memoire
Pointeur• Pour manipuler les adresses memoire nous avons besoin de
variables particulieres appelees pointeurs.
• Un pointeur est donc une variable qui contient l’adresse d’unedonnee contenue en memoire.
• Un pointeur aura une valeur entiere (qui represente une adressememoire).
• Grace aux pointeurs, on separe le contenu (une valeur) ducontenant (une adresse).
12 / 111
![Page 15: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/15.jpg)
Gestion dynamique de la memoire
Pointeur• Pour manipuler les adresses memoire nous avons besoin de
variables particulieres appelees pointeurs.
• Un pointeur est donc une variable qui contient l’adresse d’unedonnee contenue en memoire.
• Un pointeur aura une valeur entiere (qui represente une adressememoire).
• Grace aux pointeurs, on separe le contenu (une valeur) ducontenant (une adresse).
12 / 111
![Page 16: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/16.jpg)
Gestion dynamique de la memoire
Pointeur• Pour manipuler les adresses memoire nous avons besoin de
variables particulieres appelees pointeurs.
• Un pointeur est donc une variable qui contient l’adresse d’unedonnee contenue en memoire.
• Un pointeur aura une valeur entiere (qui represente une adressememoire).
• Grace aux pointeurs, on separe le contenu (une valeur) ducontenant (une adresse).
12 / 111
![Page 17: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/17.jpg)
Organisation de la memoire
3 partiesPour faire simple, la memoire est divisee en 3 parties :
• Une partie statique contenant principalement le code desfonctions.
• Une Pile (Stack) qui contient principalement les variables creesstatiquement (au niveau de la compilation).
• Un Tas (Heap) qui contient les variables creees dynamiquement.
13 / 111
![Page 18: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/18.jpg)
Organisation de la memoire
3 partiesPour faire simple, la memoire est divisee en 3 parties :
• Une partie statique contenant principalement le code desfonctions.
• Une Pile (Stack) qui contient principalement les variables creesstatiquement (au niveau de la compilation).
• Un Tas (Heap) qui contient les variables creees dynamiquement.
13 / 111
![Page 19: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/19.jpg)
Organisation de la memoire
3 partiesPour faire simple, la memoire est divisee en 3 parties :
• Une partie statique contenant principalement le code desfonctions.
• Une Pile (Stack) qui contient principalement les variables creesstatiquement (au niveau de la compilation).
• Un Tas (Heap) qui contient les variables creees dynamiquement.
13 / 111
![Page 20: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/20.jpg)
Organisation de la memoire
3 partiesPour faire simple, la memoire est divisee en 3 parties :
• Une partie statique contenant principalement le code desfonctions.
• Une Pile (Stack) qui contient principalement les variables creesstatiquement (au niveau de la compilation).
• Un Tas (Heap) qui contient les variables creees dynamiquement.
13 / 111
![Page 21: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/21.jpg)
Gestion dynamique de la memoire
DeclarationType *Nom de la variable;
• Le type peut-etre de type simple (entier, reel, ...) ou complexe.
• La presence de ”*” indique que l’on ne travaille plus sur unevariable normale, mais sur un pointeur.
• Au niveau de la compilation (allocation statique) :
seul l’espace dedie au pointeur est reserve.La taille de cet espace est fixe etelle est completement independante du type de donnees ”pointe”par la variable pointeur.
14 / 111
![Page 22: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/22.jpg)
Gestion dynamique de la memoire
DeclarationType *Nom de la variable;
• Le type peut-etre de type simple (entier, reel, ...) ou complexe.
• La presence de ”*” indique que l’on ne travaille plus sur unevariable normale, mais sur un pointeur.
• Au niveau de la compilation (allocation statique) :
seul l’espace dedie au pointeur est reserve.La taille de cet espace est fixe etelle est completement independante du type de donnees ”pointe”par la variable pointeur.
14 / 111
![Page 23: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/23.jpg)
Gestion dynamique de la memoire
DeclarationType *Nom de la variable;
• Le type peut-etre de type simple (entier, reel, ...) ou complexe.
• La presence de ”*” indique que l’on ne travaille plus sur unevariable normale, mais sur un pointeur.
• Au niveau de la compilation (allocation statique) :
seul l’espace dedie au pointeur est reserve.La taille de cet espace est fixe etelle est completement independante du type de donnees ”pointe”par la variable pointeur.
14 / 111
![Page 24: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/24.jpg)
Gestion dynamique de la memoire
DeclarationType *Nom de la variable;
• Le type peut-etre de type simple (entier, reel, ...) ou complexe.
• La presence de ”*” indique que l’on ne travaille plus sur unevariable normale, mais sur un pointeur.
• Au niveau de la compilation (allocation statique) :
seul l’espace dedie au pointeur est reserve.La taille de cet espace est fixe etelle est completement independante du type de donnees ”pointe”par la variable pointeur.
14 / 111
![Page 25: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/25.jpg)
Taille d’une variable de type pointeur
123 void taille_pointeurs()4 {5 int *pointeur1;6 long double *pointeur2;7 printf ("la taille d’un pointeur sur un type \n");8 printf ("entier est de : %lu Bytes \n", sizeof(pointeur1));9 printf ("long double est de : %lu Bytes \n", sizeof(pointeur2));
10 }
15 / 111
![Page 26: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/26.jpg)
Taille d’une variable de type pointeur
Exemple• L’execution du programme donne : la taille d’un pointeur
sur un type entier est de : 8 Bytessur un type long double est de : 8 Bytes
• La taille reservee a une variable de type pointeur est la meme.
16 / 111
![Page 27: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/27.jpg)
Taille d’une variable de type pointeur
Exemple• L’execution du programme donne : la taille d’un pointeur
sur un type entier est de : 8 Bytessur un type long double est de : 8 Bytes
• La taille reservee a une variable de type pointeur est la meme.
16 / 111
![Page 28: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/28.jpg)
Adresse et valeur
• Nous avons deja vu que si A est une variable de type T, alors&T
donne l’adresse de l’emplacement de T dans la memoire.
• Si p est une variable de type pointeur vers une donnee de type T,alors
*pdonne le contenu de l’emplacement memoire dont l’adresse est p.
• Il est possible des operations sur les pointeurs.
17 / 111
![Page 29: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/29.jpg)
Adresse et valeur
• Nous avons deja vu que si A est une variable de type T, alors&T
donne l’adresse de l’emplacement de T dans la memoire.
• Si p est une variable de type pointeur vers une donnee de type T,alors
*pdonne le contenu de l’emplacement memoire dont l’adresse est p.
• Il est possible des operations sur les pointeurs.
17 / 111
![Page 30: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/30.jpg)
Adresse et valeur
• Nous avons deja vu que si A est une variable de type T, alors&T
donne l’adresse de l’emplacement de T dans la memoire.
• Si p est une variable de type pointeur vers une donnee de type T,alors
*pdonne le contenu de l’emplacement memoire dont l’adresse est p.
• Il est possible des operations sur les pointeurs.
17 / 111
![Page 31: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/31.jpg)
Affectations
• Soit p1 et p2 deux pointeurs du meme type T. Soit A une variablede type T. Alors, les operations suivantes sont permises :
• Affectation d’adresse a un pointeur :
p1 = p2
p1 = &A
p1 = NULL
• Affectation de valeur :
∗p1 = ∗p2
∗p1 = A
A = ∗p1
18 / 111
![Page 32: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/32.jpg)
Affectations
• Soit p1 et p2 deux pointeurs du meme type T. Soit A une variablede type T. Alors, les operations suivantes sont permises :
• Affectation d’adresse a un pointeur :p1 = p2
p1 = &A
p1 = NULL
• Affectation de valeur :
∗p1 = ∗p2
∗p1 = A
A = ∗p1
18 / 111
![Page 33: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/33.jpg)
Affectations
• Soit p1 et p2 deux pointeurs du meme type T. Soit A une variablede type T. Alors, les operations suivantes sont permises :
• Affectation d’adresse a un pointeur :p1 = p2
p1 = &A
p1 = NULL
• Affectation de valeur :
∗p1 = ∗p2
∗p1 = A
A = ∗p1
18 / 111
![Page 34: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/34.jpg)
Affectations
• Soit p1 et p2 deux pointeurs du meme type T. Soit A une variablede type T. Alors, les operations suivantes sont permises :
• Affectation d’adresse a un pointeur :p1 = p2
p1 = &A
p1 = NULL
• Affectation de valeur :
∗p1 = ∗p2
∗p1 = A
A = ∗p1
18 / 111
![Page 35: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/35.jpg)
Affectations
• Soit p1 et p2 deux pointeurs du meme type T. Soit A une variablede type T. Alors, les operations suivantes sont permises :
• Affectation d’adresse a un pointeur :p1 = p2
p1 = &A
p1 = NULL
• Affectation de valeur :
∗p1 = ∗p2
∗p1 = A
A = ∗p1
18 / 111
![Page 36: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/36.jpg)
Affectations
• Soit p1 et p2 deux pointeurs du meme type T. Soit A une variablede type T. Alors, les operations suivantes sont permises :
• Affectation d’adresse a un pointeur :p1 = p2
p1 = &A
p1 = NULL
• Affectation de valeur :
∗p1 = ∗p2
∗p1 = A
A = ∗p1
18 / 111
![Page 37: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/37.jpg)
Affectations
• Soit p1 et p2 deux pointeurs du meme type T. Soit A une variablede type T. Alors, les operations suivantes sont permises :
• Affectation d’adresse a un pointeur :p1 = p2
p1 = &A
p1 = NULL
• Affectation de valeur :
∗p1 = ∗p2
∗p1 = A
A = ∗p1
18 / 111
![Page 38: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/38.jpg)
Allocations
Soit p1 un pointeur vers des donnees type T.
• Allouer (p1);
• Liberer (p1);
19 / 111
![Page 39: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/39.jpg)
Allocations
Soit p1 un pointeur vers des donnees type T.• Allouer (p1);
• Liberer (p1);
19 / 111
![Page 40: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/40.jpg)
Allocations
Soit p1 un pointeur vers des donnees type T.• Allouer (p1);
• Liberer (p1);
19 / 111
![Page 41: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/41.jpg)
Exemple
20 / 111
![Page 42: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/42.jpg)
Trace
Regardons la trace de la sequence suivante.
1 int i;2 int *p;3 i=30;4 p=&i;5 i=412;6 p=(int *) malloc (sizeof (int));7 *p=20;8 free(p);
• On imprimera les emplacements des variables (tas, pile).• Pour la variable entiere i on imprimera son adresse memoire ”&i”
et son contenu ”i”.• Pour la variable de type pointeur p on imprimera son adresse
memoire ”&p”, son contenu ”p” et l’element sur lequel elle pointe”*p”.
21 / 111
![Page 43: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/43.jpg)
Deroulement du programme
int i;Execution de l’instruction
@ memoire Contenu de la Pile
i = 0x7fff68be0ae4 0
Contenu du Tas
22 / 111
![Page 44: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/44.jpg)
Deroulement du programme
int *p;Execution de l’instruction
@ memoire Contenu de la Pile
i = 0x7fff68be0ae4 0
p = 0x7fff68be0ad8 0x0
Contenu du Tas
23 / 111
![Page 45: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/45.jpg)
Deroulement du programme
i=30;Execution de l’instruction
@ memoire Contenu de la Pile
i = 0x7fff68be0ae4 �S0 30
p = 0x7fff68be0ad8 0x0
Contenu du Tas
24 / 111
![Page 46: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/46.jpg)
Deroulement du programme
p=&i;Execution de l’instruction
@ memoire Contenu de la Pile
i = 0x7fff68be0ae4 30
p = 0x7fff68be0ad8 ��HH0x0 0x7fff68be0ae4
Contenu du Tas
25 / 111
![Page 47: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/47.jpg)
Deroulement du programme
i=412;Execution de l’instruction
@ memoire Contenu de la Pile
i = 0x7fff68be0ae4 ��ZZ30 412
p = 0x7fff68be0ad8 0x7fff68be0ae4
Contenu du Tas
26 / 111
![Page 48: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/48.jpg)
Deroulement du programme
p=(int *) malloc (sizeof (int));Execution de l’instruction
@ memoire Contenu de la Pile
i = 0x7fff68be0ae4 412
p = 0x7fff68be0ad8 ((((((((hhhhhhhh0x7fff68be0ae4 0x109100900
Contenu du Tas
0x109100900 0
27 / 111
![Page 49: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/49.jpg)
Deroulement du programme
*p=20;Execution de l’instruction
@ memoire Contenu de la Pile
i = 0x7fff68be0ae4 412
p = 0x7fff68be0ad8 0x109100900
Contenu du Tas
0x109100900 �S0 20
28 / 111
![Page 50: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/50.jpg)
Deroulement du programme
free(p);Execution de l’instruction
@ memoire Contenu de la Pile
i = 0x7fff68be0ae4 412
p = 0x7fff68be0ad8 0x109100900
Contenu du Tas
0x109100900 ��ZZ20
29 / 111
![Page 51: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/51.jpg)
Enregistrement et liste chaınee
30 / 111
![Page 52: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/52.jpg)
Enregistrement ou structure
DefinitionsLa structure ou l’enregistrement permet de decrire un type complexeet de regrouper differentes types en un seul.
• On declare une structure avec le mot clef ”struct”. Par exemple :
struct etudiant{int age;char *niveau_etude;
};
31 / 111
![Page 53: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/53.jpg)
Enregistrement ou structure
Remarques
• Il n’y a pas d’espace memoire reserve pour la definition d’un typeenregistrement.
• On declare une variable A de type enregistrement par :
struct etudiant A;
• L’acces a un champs de A se fait grace a l’operateur ”.”. Parexemple, A.age permet d’acceder au champs ”age” et secomporte comme une variable de type entier.
• Bien sur on peut declarer un pointeur vers une variable de typeenregistrement.
32 / 111
![Page 54: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/54.jpg)
Enregistrement ou structure
Remarques• Il n’y a pas d’espace memoire reserve pour la definition d’un type
enregistrement.
• On declare une variable A de type enregistrement par :
struct etudiant A;
• L’acces a un champs de A se fait grace a l’operateur ”.”. Parexemple, A.age permet d’acceder au champs ”age” et secomporte comme une variable de type entier.
• Bien sur on peut declarer un pointeur vers une variable de typeenregistrement.
32 / 111
![Page 55: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/55.jpg)
Enregistrement ou structure
Remarques• Il n’y a pas d’espace memoire reserve pour la definition d’un type
enregistrement.• On declare une variable A de type enregistrement par :
struct etudiant A;
• L’acces a un champs de A se fait grace a l’operateur ”.”. Parexemple, A.age permet d’acceder au champs ”age” et secomporte comme une variable de type entier.
• Bien sur on peut declarer un pointeur vers une variable de typeenregistrement.
32 / 111
![Page 56: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/56.jpg)
Enregistrement ou structure
Remarques• Il n’y a pas d’espace memoire reserve pour la definition d’un type
enregistrement.• On declare une variable A de type enregistrement par :
struct etudiant A;
• L’acces a un champs de A se fait grace a l’operateur ”.”. Parexemple, A.age permet d’acceder au champs ”age” et secomporte comme une variable de type entier.
• Bien sur on peut declarer un pointeur vers une variable de typeenregistrement.
32 / 111
![Page 57: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/57.jpg)
Structure recursive avec pointeur
Une structure recursive avec pointeur r est une structure composee dedeux parties :
• La premiere partie contient l’element a stocker qui peut-etre detype simple (un entier par exemple) ou de type complexe (unenregistrement ou un tableau).
• La deuxieme partie contient une variable de type pointeur, qui aufait ”pointe” vers un element de type r . Ce pointeur est essentielpour enchainer differents elements de type r .
element
Pointeur
un enregistrement de type r
33 / 111
![Page 58: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/58.jpg)
Structure recursive avec pointeur
Une structure recursive avec pointeur r est une structure composee dedeux parties :
• La premiere partie contient l’element a stocker qui peut-etre detype simple (un entier par exemple) ou de type complexe (unenregistrement ou un tableau).
• La deuxieme partie contient une variable de type pointeur, qui aufait ”pointe” vers un element de type r . Ce pointeur est essentielpour enchainer differents elements de type r .
element
Pointeur
un enregistrement de type r
33 / 111
![Page 59: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/59.jpg)
Structure recursive avec pointeur
Une structure recursive avec pointeur r est une structure composee dedeux parties :
• La premiere partie contient l’element a stocker qui peut-etre detype simple (un entier par exemple) ou de type complexe (unenregistrement ou un tableau).
• La deuxieme partie contient une variable de type pointeur, qui aufait ”pointe” vers un element de type r . Ce pointeur est essentielpour enchainer differents elements de type r .
element
Pointeur
un enregistrement de type r
33 / 111
![Page 60: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/60.jpg)
Structure recursive avec pointeur
Une structure recursive avec pointeur r est une structure composee dedeux parties :
• La premiere partie contient l’element a stocker qui peut-etre detype simple (un entier par exemple) ou de type complexe (unenregistrement ou un tableau).
• La deuxieme partie contient une variable de type pointeur, qui aufait ”pointe” vers un element de type r . Ce pointeur est essentielpour enchainer differents elements de type r .
element
Pointeur
un enregistrement de type r
33 / 111
![Page 61: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/61.jpg)
Pomme, peche, poire, abricot
Jeu avec une liste chaıneeEcrire une fonction qui code le jeu avec une representation par la listechaınee circulaire.Il s’agit d’ecrire une fonction qui prend en parametre le nombre dejoueurs, les stocke dans une liste chaınee.
34 / 111
![Page 62: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/62.jpg)
Jeu avec une liste chaınee : partie declaration
12 struct noeud_joueur3 {4 int numero_joueur;5 struct noeud_joueur *suivant;6 };78 typedef struct noeud_joueur joueur;
35 / 111
![Page 63: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/63.jpg)
Jeu avec une liste chaınee : creation de la liste
1 joueur *creation_de_liste(int N)2 {3 int i;4 joueur *p, *debut;5 for (i=0; i<N; i++)6 {7 if (i == 0)8 {9 debut = (joueur *)malloc(sizeof(joueur));
10 p = debut;11 }12 else13 {14 p->suivant = (joueur *) malloc(sizeof(joueur));15 p = p->suivant;16 }17 p->numero_joueur=i;18 }19 p->suivant = debut;20 return (debut);21 }
36 / 111
![Page 64: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/64.jpg)
Trace de la fonction creation
• Pour la trace on prendra :
Nombre de joueur = 3.M=2
• On imprimera les emplacements des variables (tas, pile).
• Pour la variable entiere i on imprimera son adresse memoire ”&i”et son contenu ”i”.
• Pour les variables de type pointeur p et debut on imprimera leuradresse memoire, leur contenu et les elements sur lesquels ellespointent.
37 / 111
![Page 65: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/65.jpg)
Instruction : int i=0;
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 0
Contenu du Tas
38 / 111
![Page 66: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/66.jpg)
Instruction : joueur *p;
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 0
p = 0x7fff6edd3a78 0x1
Contenu du Tas
39 / 111
![Page 67: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/67.jpg)
Instruction : joueur *debut;
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 0
p = 0x7fff6edd3a78 0x1
debut = 0x7fff6edd3a70 0x0
Contenu du Tas
40 / 111
![Page 68: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/68.jpg)
Instruction : for (i=0; i<N; i++)
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 0
p = 0x7fff6edd3a78 0x1
debut = 0x7fff6edd3a70 0x0
Contenu du Tas
41 / 111
![Page 69: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/69.jpg)
Instruction : debut = (joueur *)malloc(sizeof(joueur));
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 0
p = 0x7fff6edd3a78 0x1
debut = 0x7fff6edd3a70 ��HH0x0 0x10f300900
Contenu du Tas
0x10f300900
00x0
42 / 111
![Page 70: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/70.jpg)
Instruction : p = debut;
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 0
p = 0x7fff6edd3a78 ��HH0x1 0x10f300900
debut = 0x7fff6edd3a70 0x10f300900
Contenu du Tas
0x10f300900
00x0
43 / 111
![Page 71: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/71.jpg)
Instruction : p− >numero joueur=i;
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 0
p = 0x7fff6edd3a78 0x10f300900
debut = 0x7fff6edd3a70 0x10f300900
Contenu du Tas
0x10f300900
00x0
44 / 111
![Page 72: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/72.jpg)
Instruction : for (i=0; i<N; i++)
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 �A0 1
p = 0x7fff6edd3a78 0x10f300900
debut = 0x7fff6edd3a70 0x10f300900
Contenu du Tas
0x10f300900
00x0
45 / 111
![Page 73: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/73.jpg)
Instruction : p− >suivant = (joueur *) malloc(sizeof(joueur));
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 1
p = 0x7fff6edd3a78 0x10f300900
debut = 0x7fff6edd3a70 0x10f300900
Contenu du Tas
0x10f300910
00x0
0x10f300900
0
��HH0x0 0x10f300910
46 / 111
![Page 74: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/74.jpg)
Instruction : p = p− >suivant;
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 1
p = 0x7fff6edd3a78 ((((((hhhhhh0x10f300900 0x10f300910
debut = 0x7fff6edd3a70 0x10f300900
Contenu du Tas
0x10f300910
00x0
0x10f300900
00x10f300910
47 / 111
![Page 75: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/75.jpg)
Instruction : p− >numero joueur=i;
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 1
p = 0x7fff6edd3a78 0x10f300910
debut = 0x7fff6edd3a70 0x10f300900
Contenu du Tas
0x10f300910
�A0 10x0
0x10f300900
00x10f300910
48 / 111
![Page 76: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/76.jpg)
Instruction : for (i=0; i<N; i++)
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 �A1 2
p = 0x7fff6edd3a78 0x10f300910
debut = 0x7fff6edd3a70 0x10f300900
Contenu du Tas
0x10f300910
10x0
0x10f300900
00x10f300910
49 / 111
![Page 77: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/77.jpg)
Instruction : p− >suivant = (joueur *) malloc(sizeof(joueur));
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 2
p = 0x7fff6edd3a78 0x10f300910
debut = 0x7fff6edd3a70 0x10f300900
Contenu du Tas
0x10f300920
00x0
0x10f300910
1
��HH0x0 0x10f300920
0x10f300900
00x10f300910
50 / 111
![Page 78: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/78.jpg)
Instruction : p = p− >suivant;
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 2
p = 0x7fff6edd3a78 ((((((hhhhhh0x10f300910 0x10f300920
debut = 0x7fff6edd3a70 0x10f300900
Contenu du Tas
0x10f300920
00x0
0x10f300910
10x10f300920
0x10f300900
00x10f300910
51 / 111
![Page 79: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/79.jpg)
Instruction : p− >numero joueur=i;
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 2
p = 0x7fff6edd3a78 0x10f300920
debut = 0x7fff6edd3a70 0x10f300900
Contenu du Tas
0x10f300920
�A0 20x0
0x10f300910
10x10f300920
0x10f300900
00x10f300910
52 / 111
![Page 80: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/80.jpg)
Instruction : p− >suivant = debut;
@ memoire Contenu de la Pile
i = 0x7fff6edd3a84 3
p = 0x7fff6edd3a78 0x10f300920
debut = 0x7fff6edd3a70 0x10f300900
Contenu du Tas
0x10f300920
2
��HH0x0 0x10f300900
0x10f300910
10x10f300920
0x10f300900
00x10f300910
53 / 111
![Page 81: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/81.jpg)
Jeu avec une liste chaınee
Ecrire une fonction qui :
• prend en parametre une liste chaınee circulaire qui contient lesidentifiants des joueurs,
• supprime, au fur et a mesure, de la liste les joueurs elimines et
• retourne l’identifiant du gagnant.
54 / 111
![Page 82: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/82.jpg)
Jeu avec une liste chaınee : partie jeu
12 int jeu(int M, joueur *debut)3 {4 int i;5 joueur *p=debut, *precedent;6 while (p->suivant !=p)7 {8 for (i=0; i<M; i++)9 {
10 precedent=p;11 p=p->suivant;12 }13 precedent->suivant=p->suivant;14 free (p);15 p=precedent->suivant;1617 }18 return p->numero_joueur;19 }
55 / 111
![Page 83: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/83.jpg)
Deroulement detaillede la fonction jeu
56 / 111
![Page 84: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/84.jpg)
Trace tres detaillee de la fonction jeu
• Pour la trace on utilisera une representation graphique a base demaillons. Nous choisirons :
Nombre de joueur = 5.M=3
• Pour chaque instruction :
On affichera les valeurs des variables entieres ”i” et M.On suivra graphiquement l’evolution des pointeurs p et precedent .
57 / 111
![Page 85: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/85.jpg)
Deroulement de l’algorithme
Partie Declaration :int i=0;joueur *p=debut;joueur *precedent=NULL;
Execution de l’instructioni M
0 3
0 1 2 3 4
p
58 / 111
![Page 86: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/86.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
0 3
0 1 2 3 4
p
59 / 111
![Page 87: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/87.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {
3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
0 3
0 1 2 3 4
p
60 / 111
![Page 88: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/88.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {
3 precedent=p;
4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
0 3
0 1 2 3 4
p, precedent
61 / 111
![Page 89: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/89.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;
4 p=p->suivant; }
5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
0 3
0 1 2 3 4
pprec
eden
t
62 / 111
![Page 90: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/90.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {
3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
1 3
0 1 2 3 4
pprec
eden
t
63 / 111
![Page 91: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/91.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {
3 precedent=p;
4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
1 3
0 1 2 3 4
p, precedent
64 / 111
![Page 92: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/92.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;
4 p=p->suivant; }
5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
1 3
0 1 2 3 4
pprec
eden
t
65 / 111
![Page 93: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/93.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {
3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
2 3
0 1 2 3 4
pprec
eden
t
66 / 111
![Page 94: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/94.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {
3 precedent=p;
4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
2 3
0 1 2 3 4
p, precedent
67 / 111
![Page 95: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/95.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;
4 p=p->suivant; }
5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
2 3
0 1 2 3 4
pprec
eden
t
68 / 111
![Page 96: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/96.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }
5 precedent->suivant=p->suivant;
6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
3 3
0 1 2 3 4
pprec
eden
t
69 / 111
![Page 97: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/97.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;
6 free (p);
7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
3 3
0 1 2 3 4
pprec
eden
t
70 / 111
![Page 98: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/98.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);
7 p=precedent->suivant; }
8 return p->numero_joueur; }
i M
3 3
0 1 2 4
pprec
eden
t
71 / 111
![Page 99: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/99.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
3 3
0 1 2 4
pprec
eden
t
72 / 111
![Page 100: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/100.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {
3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
0 3
0 1 2 4
pprec
eden
t
73 / 111
![Page 101: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/101.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {
3 precedent=p;
4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
0 3
0 1 2 4
p, precedent
74 / 111
![Page 102: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/102.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;
4 p=p->suivant; }
5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
0 3
0 1 2 4
p prec
eden
t
75 / 111
![Page 103: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/103.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {
3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
1 3
0 1 2 4
p prec
eden
t
76 / 111
![Page 104: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/104.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {
3 precedent=p;
4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
1 3
0 1 2 4
p, precedent
77 / 111
![Page 105: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/105.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;
4 p=p->suivant; }
5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
1 3
0 1 2 4
pprec
eden
t
78 / 111
![Page 106: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/106.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {
3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
2 3
0 1 2 4
pprec
eden
t
79 / 111
![Page 107: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/107.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {
3 precedent=p;
4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
2 3
0 1 2 4
p, precedent
80 / 111
![Page 108: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/108.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;
4 p=p->suivant; }
5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
2 3
0 1 2 4
pprec
eden
t
81 / 111
![Page 109: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/109.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }
5 precedent->suivant=p->suivant;
6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
3 3
0 1 2 4
pprec
eden
t
82 / 111
![Page 110: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/110.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;
6 free (p);
7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
3 3
0 1 2 4
pprec
eden
t
83 / 111
![Page 111: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/111.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);
7 p=precedent->suivant; }
8 return p->numero_joueur; }
i M
3 3
0 1 4
pprec
eden
t
84 / 111
![Page 112: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/112.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
3 3
0 1 4
pprec
eden
t
85 / 111
![Page 113: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/113.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {
3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
0 3
0 1 4
pprec
eden
t
86 / 111
![Page 114: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/114.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {
3 precedent=p;
4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
0 3
0 1 4
p, precedent
87 / 111
![Page 115: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/115.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;
4 p=p->suivant; }
5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
0 3
0 1 4
p prec
eden
t
88 / 111
![Page 116: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/116.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {
3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
1 3
0 1 4
p prec
eden
t
89 / 111
![Page 117: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/117.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {
3 precedent=p;
4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
1 3
0 1 4
p, precedent
90 / 111
![Page 118: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/118.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;
4 p=p->suivant; }
5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
1 3
0 1 4
pprec
eden
t
91 / 111
![Page 119: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/119.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {
3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
2 3
0 1 4
pprec
eden
t
92 / 111
![Page 120: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/120.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {
3 precedent=p;
4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
2 3
0 1 4
p, precedent
93 / 111
![Page 121: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/121.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;
4 p=p->suivant; }
5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
2 3
0 1 4
pprec
eden
t
94 / 111
![Page 122: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/122.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }
5 precedent->suivant=p->suivant;
6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
3 3
0 1 4
pprec
eden
t
95 / 111
![Page 123: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/123.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;
6 free (p);
7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
3 3
0 1 4
pprec
eden
t
96 / 111
![Page 124: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/124.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);
7 p=precedent->suivant; }
8 return p->numero_joueur; }
i M
3 3
0 1
p prec
eden
t
97 / 111
![Page 125: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/125.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
3 3
0 1
p prec
eden
t
98 / 111
![Page 126: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/126.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {
3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
0 3
0 1
p prec
eden
t
99 / 111
![Page 127: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/127.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {
3 precedent=p;
4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
0 3
0 1
p, precedent
100 / 111
![Page 128: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/128.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;
4 p=p->suivant; }
5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
0 3
0 1
pprec
eden
t
101 / 111
![Page 129: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/129.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {
3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
1 3
0 1
pprec
eden
t
102 / 111
![Page 130: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/130.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {
3 precedent=p;
4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
1 3
0 1
p, precedent
103 / 111
![Page 131: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/131.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;
4 p=p->suivant; }
5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
1 3
0 1
p prec
eden
t
104 / 111
![Page 132: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/132.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {
2 for (i=0; i<M; i++) {
3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
2 3
0 1
p prec
eden
t
105 / 111
![Page 133: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/133.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {
3 precedent=p;
4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
2 3
0 1
p, precedent
106 / 111
![Page 134: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/134.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;
4 p=p->suivant; }
5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
2 3
0 1
pprec
eden
t
107 / 111
![Page 135: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/135.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }
5 precedent->suivant=p->suivant;
6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
3 3
0 1
pprec
eden
t
108 / 111
![Page 136: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/136.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;
6 free (p);
7 p=precedent->suivant; }8 return p->numero_joueur; }
i M
3 3
0 1
pprec
eden
t
109 / 111
![Page 137: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/137.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);
7 p=precedent->suivant; }
8 return p->numero_joueur; }
i M
3 3
0
p, precedent
110 / 111
![Page 138: Pointeurs : gestion dynamique de la memoire´](https://reader036.vdocuments.fr/reader036/viewer/2022062420/62aef322701b05489344f257/html5/thumbnails/138.jpg)
Deroulement de l’algorithme
1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }
8 return p− >numero joueur; }
i M
5 5
Le gagnant est :
0
111 / 111