Les pointeurs Suite Pointeurs Un pointeur cest une

  • Slides: 15
Download presentation
Les pointeurs Suite

Les pointeurs Suite

Pointeurs Un pointeur, c’est une variable dont la valeur est l'adresse d'une cellule de

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. Un pointeur, c’est alors une variable de type int (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

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 case Imaginons que l’utilisateur modifie (avec un cin 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 *id. Ptr; Nom de la variable Le type peut

Syntaxe Déclaration : * type *id. Ptr; Nom de la variable Le type peut être un type simple (int, float…) ou un objet (n’importe quelle classe). Ce petit signe indique l’on ne travaille plus sur une variable normale, mais sur un pointeur

Syntaxe Opérateur d’adresse : & cout<<&id. Var; Nom d’une variable de n’importe quel type

Syntaxe Opérateur d’adresse : & cout<<&id. Var; Nom d’une variable de n’importe quel type Plutôt que d’afficher la valeur de la variable, on affiche l’adresse de la case mémoire Ce petit signe indique l’on veux récupérer l’adresse d’une variable

Syntaxe Opérateur de déréférencement : * cout<<*ptr; Nom d’un pointeur Plutôt que d’afficher l’adresse

Syntaxe Opérateur de déréférencement : * cout<<*ptr; Nom d’un pointeur Plutôt que d’afficher l’adresse du pointeur, on affiche la valeur qui est dans la case mémoire Ce petit signe indique l’on veux récupérer la valeur située à une adresse précise

Syntaxe On déclare une variable normale de type caractère Exemple : char c =

Syntaxe On déclare une variable normale de type caractère Exemple : char c = ‘a’; char *p; p=&c; cout << *p; 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’)

4 AC 0 Exemple… 4 ABF 4 ABE Finalement : int i; int *p;

4 AC 0 Exemple… 4 ABF 4 ABE Finalement : 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 ? Tas 23 AA 23 A 9 23 A 8 23 A 7 23 A 6 p 23 A 6 23 58 i 23 A 5 F 3 DE 23 A 4 0 F 4 D BSS Prog 8

Mais ce n’est pas tout ! Half life 2 : 4 Go de texture,

Mais ce n’est pas tout ! Half life 2 : 4 Go de texture, de sons… Windows Vista : 4 Go de programmes… Question : Comment faire pour jouer à Half Life 2 quand on exécute Windows Vista sur une machine ne disposant que de 1 Go de mémoire vive?

Réponse Vista et Half Life 2 ne doivent pas charger tout en mémoire… Uniquement

Réponse Vista et Half Life 2 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 : new pour réserver une case delete pour supprimer le contenu d’une case 10

4 AC 0 Rappels… Finalement : int i; int *p; i=23; //diff entre i

4 AC 0 Rappels… Finalement : 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; 4 ABF 4 ABE Tas 23 AA 23 A 9 23 A 8 6 23 A 7 23 A 6 23 A 8 p 23 A 6 23 58 i 23 A 5 F 3 DE 23 A 4 0 F 4 D BSS Prog 11

4 AC 0 Rappels… 4 ABF 4 ABE Exemples de bugs : Tas 23

4 AC 0 Rappels… 4 ABF 4 ABE Exemples de bugs : Tas 23 AA 23 A 9 int *p; p=new int; *p=6; 6 23 A 8 23 A 7 23 A 9 23 A 8 23 A 6 F 3 DE 23 A 5 0 F 4 D p BSS Prog 23 A 4 12

4 AC 0 ! ! Rappels… ! t l u Exemples de bugs :

4 AC 0 ! ! Rappels… ! t l u Exemples de bugs : a F int *p; on i t int *q; a t p=new int; n e q=p; m g Se *p=6; delete p; 4 ABF 4 ABE Tas 23 AA 23 A 9 23 A 8 6 23 A 7 23 A 8 p 23 A 8 q 23 A 6 cout<<*q; 23 A 5 F 3 DE 23 A 4 0 F 4 D BSS Prog 13

Mémoire dynamique Allocation de mémoire dynamique int *tab; tab = new int [10]; Destruction

Mémoire dynamique Allocation de mémoire dynamique int *tab; tab = new int [10]; Destruction de la mémoire delete [] tab; Avantage : Créer des tableaux de taille défini par l’utilisateur

void affiche. Tout. Tableau (int *tab, int taille) { for (int i=0; i<taille; i++)

void affiche. Tout. Tableau (int *tab, int taille) { for (int i=0; i<taille; i++) cout<<tab[i]<<endl; } void saisie. Tout. Tableau (int *tab, int taille) { for (int i=0; i<taille; i++) cin>>tab[i]; Il est possible d’utiliser les } crochets, comme pour un int main(void) { tableau normal… int *tab; On ne connait plus par contre int taille; le nombre de case ! cin >> taille; tab = new int [taille]; saisie. Tout. Tableau(tab, taille); affiche. Tout. Tableau(tab, taille); delete []tab; affiche. Tout. Tableau(tab, taille); return 0; }