Les pointeurs 1
Notion de pointeurs cest Travailler avec les pointeurs cest Se rapprocher du matériel Nécessite de bien connaitre le fonctionnement de la mémoire Faire des applications rapides Faire des applications bugées Avoir mal à la tête 2
Notion de pointeurs cest Travailler avec les pointeurs cest Se rapprocher du matériel Faire des applications rapides Réserver la mémoire quand on en a besoin Faire des applications bugées Avoir mal à la tête 3
Notion de pointeurs cest Travailler avec les pointeurs cest Se rapprocher du matériel Faire des applications rapides Faire des applications bugées Oublier de libérer la mémoire « segmentation fault » Avoir mal à la tête 4
Notion de pointeurs cest Travailler avec les pointeurs cest Se rapprocher du matériel Faire des applications rapides Faire des applications bugées Avoir mal à la tête Des comportements du programme bizarre Des raisonnements très poussés 5
Rassurons nous un peu… compliqué Les pointeurs, cest compliqué En effet, même les plus grands programmateurs font encore ce genre derreurs (Windows, Half-Life…) ch.. Les pointeurs, cest pour nous faire ch.. En effet, on en aura bientôt plus besoin (java, C#...) 6
Mais… pas si Les pointeurs, cest pas si compliqué Avec de la méthode et en prenant du temps, on y arrive (et même facilement) utile Les pointeurs, cest utile Lorsque lon recherche la rapidité (jeux vidéo, programmation Temps réel,…) on est obligé dy passer 7
(Rappels sur ) le matériel mémoire Organisation de la mémoire 8 Programme réel (toto.exe) Comprend le code et les constantes Variables statiques (toutes les variables sauf les pointeurs) Variables dynamiques (les pointeurs) Paramètres des fonctions
Suite des rappels Zoom sur la pile et le tas 9 Augmente quand on appelle une fonction (on empile les paramètres de la fonction et les paramètres locaux (et 2-3 autres trucs)) new Augmente quand on fait appel à linstruction new
Rappels… Finalement : 10 i 4ABF 4AC0 4ABE 23A9 23AA 23A8 p 23A6 23 int i; int *p; i=23; //diff entre i et &i ? p=&i; //diff entre p et *p ? i=58; //valeur de *p ? p=new int; *p=6; 58 F3DE 0F4D 23A7 23A6 23A5 23A4 Prog BSS Tas 23A8 6
Rappels… Exemples de bugs : 11 4ABF 4AC0 4ABE 23A9 23AA 23A8 p int *p; p=new int; *p=6; F3DE 0F4D 23A7 23A6 23A5 23A4 Prog BSS Tas 6 23A9 23A8 23A9
Rappels… Exemples de bugs : 12 4ABF 4AC0 4ABE 23A9 23AA 23A8 p int *p; int *q; p=new int; q=p; *p=6; delete p; cout<<*q; F3DE 0F4D 23A7 23A6 23A5 23A4 Prog BSS Tas 6 23A8 q
De la mémoire sur mesure Half life 2 : 4Go de texture, de sons… Windows Vista : 4Go de programmes… Question : Half Life 2 Windows Vista Comment faire pour jouer à Half Life 2 quand on exécute Windows Vista sur une machine ne disposant que de 1Go de mémoire vive? 13
Réponse Vista et Half Life2 ne doivent pas charger tout en mémoire… Uniquement ce quil faut Conclusion : Vive les pointeurs Vive les pointeurs 14
Utilité du pointeur : On veut charger une map? new… On veut décharger une map ? delete... Doù lexplication du « loading » Succession de new et delete… 15
Utilité du pointeur OK, cest utile… On utilise plus que ça? mais Cest tout a fait possible, mais : Très compliqué à utiliser delete Penser à faire un delete dès que nécessaire new delete 3 instructions pour lutiliser (déclarer, new et delete) Coûteux en terme de place Un entier pour sauver ladresse en mémoire Lobjet en lui même 16
Quand utiliser un pointeur ? gros Quand on utilise un « gros » objet. Quand lobjet contient beaucoup dattributs quand Quand on sait ne sait pas quand on aura besoin de la variable Interaction avec utilisateur, paquets réseau… exercice Quand on fait un exercice sur les pointeurs… 17
Quand utiliser un pointeur ? partout Une fois les bases apprises et acquises, on est tenté den utiliser partout. oublier Danger : oublier de faire un delete ! IMPORTANT IMPORTANT : Implémenter les destructeurs à chaque fois que lon a un attribut de type pointeur ! 18
00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF 00B0 19 Code du programme BSSTas void main(){ node exemple(0); exemple.valeur=0; exemple.suivant=new node(5); node *iter; iter=&exemple; iter=iter->suivant; node *iter2=iter; iter2->suivant=new node(10); iter2=iter2->suivant; iter2->suivant=new node(20); iter2=null; iter=null; delete iter; iter=null; } class node{ int valeur; node *suivant; }
00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF 00B0 20 Code du programme BSSTas void main(){ node *iter=new node(-1); for(int i=0;i<5;i++){ iter->suivant=new node(i); iter=iter->suivant(); }; node *iter1=iter; iter=iter1; for(int i=0;i<5;i++){ cout valeur; iter=iter->suivant(); } class node{ int valeur; node *suivant; }
00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF 00B0 21 Code du programme BSSTas void main(){ node *iter=new node(-1); node *iter1=iter; for(int i=0;i<5;i++){ iter->suivant=new node(i); iter=iter->suivant(); } iter=iter1; while (iter != null) { cout valeur; iter=iter->suivant(); } class node{ int valeur; node *suivant; }