rappels c++

21
Rappels C++ Les pointeurs 1

Upload: vivien

Post on 24-Feb-2016

54 views

Category:

Documents


2 download

DESCRIPTION

Rappels C++. Les pointeurs. Notion de pointeurs. Travailler avec les pointeurs c’est 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. Notion de pointeurs. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Rappels C++

Rappels C++Les pointeurs

1

Page 2: Rappels C++

Notion de pointeursTravailler avec les pointeurs c’est

Se rapprocher du matériel Nécessite de bien connaitre le fonctionnement de la

mémoireFaire des applications rapidesFaire des applications bugéesAvoir mal à la tête

2

Page 3: Rappels C++

Notion de pointeursTravailler avec les pointeurs c’est

Se rapprocher du matérielFaire des applications rapides

Réserver la mémoire quand on en a besoinFaire des applications bugéesAvoir mal à la tête

3

Page 4: Rappels C++

Notion de pointeursTravailler avec les pointeurs c’est

Se rapprocher du matérielFaire des applications rapidesFaire des applications bugées

Oublier de libérer la mémoire « segmentation fault »

Avoir mal à la tête

4

Page 5: Rappels C++

Notion de pointeursTravailler avec les pointeurs c’est

Se rapprocher du matérielFaire des applications rapidesFaire des applications bugéesAvoir mal à la tête

Des comportements du programme bizarre Des raisonnements très poussés

5

Page 6: Rappels C++

Rassurons nous un peu…Les pointeurs, c’est compliqué

En effet, même les plus grands programmateurs font encore ce genre d’erreurs (Windows, Half-Life…)

Les pointeurs, c’est pour nous faire ch..En effet, on en aura bientôt plus besoin (java,

C#...)

6

Page 7: Rappels C++

Mais…Les pointeurs, c’est pas si compliqué

Avec de la méthode et en prenant du temps, on y arrive (et même facilement)

Les pointeurs, c’est utileLorsque l’on recherche la rapidité (jeux vidéo,

programmation Temps réel,…) on est obligé d’y passer

7

Page 8: Rappels C++

(Rappels sur ) le matérielOrganisation 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

Page 9: Rappels C++

9

Suite des rappelsZoom sur la pile et le tas

Augmente quand on appelle une fonction (on empile les paramètres de la fonction et les paramètres locaux (et 2-3 autres trucs))

Augmente quand on fait appel à l’instruction new

Page 10: Rappels C++

Rappels…Finalement :

10

i

4ABF

4AC0

4ABE

23A9

23AA

23A8

p23A623

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

F3DE0F4D

23A7

23A6

23A5

23A4 Prog

BSS

Tas

23A8

23A8 6

Page 11: Rappels C++

Rappels…Exemples de bugs :

11

4ABF

4AC0

4ABE

23A9

23AA

23A8

p23A8int *p;p=new int;p=new int;*p=6;

F3DE0F4D

23A7

23A6

23A5

23A4

Prog

BSS

Tas

6

23A9

23A823A8

23A923A9

Page 12: Rappels C++

Rappels…Exemples de bugs :

12

4ABF

4AC0

4ABE

23A9

23AA

23A8

p23A8

int *p;int *q;p=new int;q=p;*p=6;delete p;cout<<*q; F3D

E0F4D

23A7

23A6

23A5

23A4Prog

BSS

Tas

6

23A8 q

23A8

Segmentation Fault !!!

Page 13: Rappels C++

De la mémoire sur mesureHalf life 2 : 4Go de texture, de sons…Windows Vista : 4Go de programmes…

Question :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

Page 14: Rappels C++

RéponseVista et Half Life2 ne doivent pas charger

tout en mémoire…Uniquement ce qu’il faut

Conclusion :Vive les pointeurs

14

Page 15: Rappels C++

Utilité du pointeur :On veut charger une map?

new…On veut décharger une map ?

delete...

D’où l’explication du « loading »Succession de new et delete…

15

Page 16: Rappels C++

Utilité du pointeurOK, c’est utile… On utilise plus que ça?C’est tout a fait possible, mais :

Très compliqué à utiliser Penser à faire un delete dès que nécessaire 3 instructions pour l’utiliser (déclarer, new et

delete)Coûteux en terme de place

Un entier pour sauver l’adresse en mémoire L’objet en lui même

16

Page 17: Rappels C++

Quand utiliser un pointeur ?Quand on utilise un « gros » objet.

Quand l’objet contient beaucoup d’attributsQuand on sait ne sait pas quand on aura

besoin de la variableInteraction avec utilisateur, paquets réseau…

Quand on fait un exercice sur les pointeurs…

17

Page 18: Rappels C++

Quand utiliser un pointeur ?Une fois les bases apprises et acquises, on

est tenté d’en utiliser partout.Danger : oublier de faire un delete !

IMPORTANT :Implémenter les destructeurs à chaque fois

que l’on a un attribut de type pointeur !

18

Page 19: Rappels C++

00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF 00B0

19Code du programme BSS Tas

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;

}

Page 20: Rappels C++

00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF 00B0

20Code du programme BSS Tas

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<<iter->valeur;iter=iter->suivant();

}}

class node{int valeur;node *suivant;

}

Page 21: Rappels C++

00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF 00B0

21Code du programme BSS Tas

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<<iter->valeur;iter=iter->suivant();

}}

class node{int valeur;node *suivant;

}