Les pointeurs

Preview:

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 !

Recommended