« Structures de données/Pointeurs » : différence entre les versions

Aller à la navigation Aller à la recherche
→‎Utilisation : images, et reformulation pour la cohérence avec les illustrations
(cohésion du texte et des images)
(→‎Utilisation : images, et reformulation pour la cohérence avec les illustrations)
 
Lexique
tp : ^T (* une variable d'un typepointeur quelconquevers quedes l'ondonnées vade stockertype en mémoire dynamiqueT *)
 
p : ^T (* un pointeur vers des données du type de t *)
Au lancement du programme, il sera réservé dans le mémoire statique l'espace permettant de stocker ce pointeur. Voici la représentation de la mémoire à cet instant :
 
[[Image:StructDonnees_Memoires_pointeur_lexi.svg]]
 
On réserve l'espace nécessaire pour stocker une variable de type T en faisait appel à l'instruction :
 
new(p)
 
Voici l'effet produit par new sur la mémoire.
 
[[Image:StructDonnees_Memoires_pointeur_new.svg]]
 
Deux choses se sont porduites :
* De la mémoire a été réservée pour stocker une donnée de type T (la case pointée est grisée).
* La variable p contient l'adresse mémoire de cet espace réservé (représenté par une flèche).
 
p contient alors l'adresse de l'espace qui nous pourront utilisé : on peut donc stocker le contenu de t en mémoire dynamique.
 
Pour utiliser l'espace pointé par p, nous utiliserons l'expression <code>p^</code>
p^:=t
 
p^:=t???
 
L'espace pointé contient alors la valeur de l'expression qu'on a assigné :
 
[[Image:StructDonnees_Memoires_pointeur_assignation.svg]]
 
On peut libérer l'espace : c'est à dire indiquer au système d'exploitation que cette partie de la mémoire dynamique n'est plus utilisée et qu'il peut désormais en faire ce qu'il veut. Pour celà on utilise la procédure "réciproque" de <code>new</code> :
delete(p)
 
[[Image:StructDonnees_Memoires_pointeur_delete.svg]]
On remarquera qu'après un <code>delete</code> la donnée stockée reste en mémoire : seul le pointeur change de valeur (il se retrouve avec la valeur "pointeur vers vide"). La valeur de t restera en mémoire tant que le système d'exploitation n'aura pas décidé d'attribuer cet espace : cette valeur est néanmoins perdue, il n'y est plus possible d'y accéder puisque son adresse est perdue.
 
On remarquera qu'après un <code>delete</code> la donnée stockée ainsi que le pointeur restent en mémoire : la seule chose qui change est que l'espace en mémoire dynamique n'est plus réservé. La donnée pointée peut donc être écrasée. La valeur de p^ restera en mémoire tant que le système d'exploitation n'aura pas décidé d'attribuer cet espace. Remarquez que demander au processeur de supprimer les contenus qui ont été stockés serait une perte de temps puisque si cette partie de la mémoire venait à être utilisé, les données serait écrasées de toute façon.
 
Remarque : l'utilité de ce qui est expliqué dans cette partie "utilisation" peut échappée au lecteur. En effet, cette partie sert seulement à donner les procédures <code>new</code> et <code>delete</code>. Stocker la valeur de t dans la mémoire dynamique n'a aucun interêt en soi puisque la valeur est déjà dans t. L'important est de comprendre comment (par <code>new</code> et <code>delete</code>) on peut stocker et lire des informations en mémoire dynamique.

Menu de navigation