1 / 15

Les pointeurs

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.

cecil
Télécharger la présentation

Les pointeurs

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Les pointeurs Suite

  2. 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.

  3. 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 cinpar exemple) la 10ème case. • a et b peuvent détecter cette modification en allant voir à la 10ème case !

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

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

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

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

  8. Exemple… 4AC0 4ABF 4ABE • Finalement : Tas 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 ? 23AA 23A9 23A8 p 23A6 23A7 BSS 23A6 i 23 58 F3DE 23A5 Prog 0F4D 23A4

  9. 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 quand on exécute Windows Vista sur une machine ne disposant que de 1Go de mémoire vive?

  10. Réponse • Vista 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 : • newpour réserver une case • deletepour supprimer le contenu d’une case

  11. Rappels… 4AC0 4ABF 4ABE • Finalement : Tas 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; 23AA 23A9 6 23A8 p 23A8 23A6 23A7 BSS 23A6 i 23 58 F3DE 23A5 Prog 0F4D 23A4

  12. Rappels… 4AC0 4ABF 4ABE • Exemples de bugs : Tas 23AA 6 23A9 23A9 int *p; p=new int; p=new int; *p=6; 23A8 23A8 p 23A9 23A8 23A7 BSS 23A6 F3DE 0F4D 23A5 Prog 23A4

  13. Rappels… 4AC0 4ABF 4ABE • Exemples de bugs : Tas Segmentation Fault !!! int *p; int *q; p=new int; q=p; *p=6; delete p; cout<<*q; 23AA 23A9 6 23A8 p 23A8 23A7 BSS 23A6 q 23A8 23A5 F3DE Prog 0F4D 23A4

  14. 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

  15. voidafficheToutTableau (int *tab, int taille) { for (int i=0; i<taille; i++) cout<<tab[i]<<endl; } voidsaisieToutTableau (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 !

More Related