Upload
cecil
View
47
Download
1
Embed Size (px)
DESCRIPTION
Les pointeurs. Suite. Pointeurs. Un pointeur, c’est une variable dont la valeur est l'adresse d'une cellule de la mémoire Traduction : Imaginons que la mémoire de l’ordinateur, c’est un grand tableau. - PowerPoint PPT Presentation
Citation preview
Suite
PointeursUn pointeur, c’est une variable dont la valeur
est l'adresse d'une cellule de la mémoireTraduction :
Imaginons que la mémoire de l’ordinateur, c’est un grand tableau.
Un pointeur, c’est alors une variable de type intint (un nombre) qui permet de se souvenir d’une case particulière.
On comprend bien que le pointeur ne se soucis pas de savoir ce qu’il y a dans la case, mais bien de l’adresse de la case.
Qu’est ce que ça change?Un pointeur est une adresse
On sépare le contenu (une valeur) du contenant (une adresse)
On a l’adresse de quelque chose, et on peut le partager :Imaginons deux pointeurs a et b pointant sur la
10ème caseImaginons que l’utilisateur modifie (avec un cincin par
exemple) la 10ème case.a et b peuvent détecter cette modification en allant
voir à la 10ème case !
Syntaxe Déclaration : *type *idPtr;
Le type peut être un type simple (int, float…) ou un objet (n’importe quelle classe).
Ce petit signe indique que l’on ne travaille plus sur une variable normale, mais sur un pointeur
Nom de la variable
Syntaxe Opérateur d’adresse : &
cout<<&idVar;
Plutôt que d’afficher la valeur de la variable, on affiche l’adresse de la case mémoire
Ce petit signe indique que l’on veux récupérer l’adresse d’une variable
Nom d’une variable de n’importe quel type
Syntaxe Opérateur de déréférencement : *
cout<<*ptr;
Plutôt que d’afficher l’adresse du pointeur, on affiche la valeur qui est dans la case mémoire
Ce petit signe indique que l’on veux récupérer la valeur située à une adresse précise
Nom d’un pointeur
Syntaxe Exemple :
char c = ‘a’;char *p;p=&c;cout << *p;
On déclare une variable normale de type caractère
On déclare un pointeur sur une case de type caractère
On donne l’adresse de la variable c au pointeur p
On affiche la valeur de la case pointée par p (‘a’)
Exemple…Finalement :
i
4ABF
4AC0
4ABE
23A9
23AA
23A8
p23A6
23
int i;int *p;i=23;//diff entre i et &i ?p=&i;//diff entre p et *p ?i=58;//valeur de p et *p ?
58
F3DE
0F4D
23A7
23A6
23A5
23A4 Prog
BSS
Tas
8
Mais ce n’est pas tout !Half life 2 : 4Go de texture, de sons…Windows Vista : 4Go de programmes…
Question :Comment faire pour jouer à Half Life 2 Half Life 2 quand
on exécute Windows Vista Windows Vista sur une machine ne disposant que de 1Go de mémoire vive?
RéponseVista et Half Life2 ne doivent pas charger
tout en mémoire…Uniquement ce qu’il faut
Il faut donc prévoir un mécanisme pour charger et décharger des zones en mémoire :newnew pour réserver une casedeletedelete pour supprimer le contenu d’une case
10
Rappels…Finalement :
i
4ABF
4AC0
4ABE
23A9
23AA
23A8
p23A6
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
11
Rappels…Exemples de bugs :
4ABF
4AC0
4ABE
23A9
23AA
23A8
p23A8int *p;p=new int;p=new int;*p=6;
F3DE
0F4D
23A7
23A6
23A5
23A4
Prog
BSS
Tas
6
23A9
23A8
23A9
12
Rappels…Exemples de bugs :
4ABF
4AC0
4ABE
23A9
23AA
23A8
p23A8
int *p;int *q;p=new int;q=p;*p=6;delete p;cout<<*q; F3DE
0F4D
23A7
23A6
23A5
23A4Prog
BSS
Tas
6
23A8 q
13
Mémoire dynamiqueAllocation de mémoire dynamiqueint *tab;tab = new int [10];Destruction de la mémoiredelete [] tab;
Avantage :Créer des tableaux de taille défini par
l’utilisateur
void afficheToutTableau (int *tab, int taille){for (int i=0; i<taille; i++)
cout<<tab[i]<<endl;}void saisieToutTableau (int *tab, int taille){for (int i=0; i<taille; i++)
cin>>tab[i];}int main(void){int *tab;int taille;cin >> taille;tab = new int [taille];saisieToutTableau(tab, taille);afficheToutTableau(tab, taille);delete []tab;afficheToutTableau(tab, taille);return 0;
}
Il est possible d’utiliser les crochets, comme pour un tableau normal…On ne connait plus par contre le nombre de case !