15
Suite

Les pointeurs

  • 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

Page 1: Les pointeurs

Suite

Page 2: Les pointeurs

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.

Page 3: Les pointeurs

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 !

Page 4: Les pointeurs

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

Page 5: Les pointeurs

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

Page 6: Les pointeurs

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

Page 7: Les pointeurs

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’)

Page 8: Les pointeurs

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

Page 9: Les pointeurs

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?

Page 10: Les pointeurs

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

Page 11: Les pointeurs

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

Page 12: Les pointeurs

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

Page 13: Les pointeurs

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

Page 14: Les pointeurs

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

Page 15: Les pointeurs

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 !