Académique Documents
Professionnel Documents
Culture Documents
Par exemple :
a, b, c : Entier
Personne=Enregistrement
Age : Entier
Fin Enregistrement
Occupe un espace mémoire dont la taille est fixée dès le début pour qu’on y place ses
valeurs
L’accès à la valeur se fait par le nom de la variable.
1 |8
Si on revient au niveau de la déclaration du tableau :
T : Tableau [1..10] de Réel
Il est à noter que T occupera toujours en mémoire 10 cases de type entier, même si on
n’en utilise effectivement que trois et même si on a besoin de plus de 10 éléments, ce qui
constitue une limite en programmation.
Il existe des solutions permettant de remédier à ces inconvénients :
Soit il faut prévoir le nombre maximum de cases d’un tableau, ce qui peut résulter en
une sous-utilisation (occupation superflue de l’espace mémoire),
Soit il faut utiliser les structures dynamiques
Les structures dynamiques permettent d’optimiser l’utilisation de l’espace mémoire :
En créant des objets seulement en cas de besoin,
En libérant l’espace mémoire non utilisé.
Une variable dynamique est un objet créé pendant l’exécution du programme, elle
possède un type, une valeur et un emplacement mémoire. Cette variable est accessible à
travers un pointeur.
Au contraire des variables statiques, une variable dynamique est caractérisée par les
propriétés suivantes :
Peut être créée et détruite au cours de l’exécution du bloc dans lequel elle est
déclarée
L’espace mémoire rendu libre peut être récupéré
L’accès à la valeur se fait par un pointeur.
Pour pouvoir définir un pointeur, nous devons d’abord définir une adresse.
Comme le numéro de la carte d’identité est un moyen pour identifier une personne, de même
l’adresse est un moyen unique pour repérer un espace dans la mémoire d’un ordinateur. Au départ
le programme dispose d’une portion de la mémoire qui est disponible pour y stocker ses variables.
Quand il crée une variable, il cherche un espace mémoire de taille suffisante et associe
2 |8
son adresse au nom de la variable. Par ailleurs, cet espace n’est plus disponible mais occupé.
L’opération qui consiste à associer une variable à un espace mémoire s’appelle allocation
dynamique. Quand une variable est détruite la case mémoire correspondante redevient libre,
cette opération s’appelle libération.
Un pointeur est une variable qui contient l’adresse d’un objet en mémoire. On l’appelle
ainsi car il permet de pointer sur une structure en mémoire et donc d’y accéder.
Si P est un pointeur qui contient l’adresse d’une case mémoire, on dit que la case
mémoire est pointée par P et P pointe sur la case mémoire. Cette case mémoire est appelé
variable pointée.
Pour déclarer un pointeur, nous avons besoin d’indiquer le type de la variable pointée,
on déclare un pointeur comme suit :
Nom_du_Pointeur : ^Type_Variable_Pointée
Par exemple :
P : ^Entier
Q : ^Réel
P est une variable qui va contenir l’adresse d’une case mémoire (créée dynamiquement) qui va
contenir de sa part une valeur entière.
Q est une variable qui va contenir aussi l’adresse d’une case mémoire dans laquelle nous allons
stocker un réel.
Lors de la déclaration d’un pointeur, une variable statique sera créée, initialement elle ne
contient aucune adresse, car on n’a pas encore créé l’espace mémoire pointée par ce pointeur.
3 |8
II.2.2. Allocation dynamique
La création d’une variable pointée a pour effet de réserver un espace mémoire, dans lequel
nous allons stocker une donnée. Cette variable pointée possède une adresse mais elle ne
possède pas d’identificateur. Elle peut être accessible seulement par l’intermédiaire d’un
pointeur. Ce dernier doit être déclaré, il est ensuite utilisé pour récupérer l’adresse de la zone
mémoire réservée.
A l’issue de cette instruction, NomPointeur est une variable statique contenant l’adresse en
mémoire d’une variable dynamique.
Ainsi la variable pointée est désigné par le nom du pointeur suivi par le symbole ^.
P : ^ Entier
P pointe sur l’espace ayant l’adresse 90, une fois cet espace
est alloué.
4 |8
P^ 5
Lorsqu’une variable pointée n’a plus d’utilité, il est possible de la supprimer et de la rendre
disponible l’espace mémoire qu’elle occupait. Cela se fait par l’intermédiaire de l’instruction
Libérer(NomPointeur).
Par exemple :
Libérer(P) supprime la variable pointée par P et restitue l’espace mémoire qu’elle
occupait, la variable pointée est ainsi complètement perdue.
La variable statique P existe toujours mais son contenu ne correspond plus à une zone
mémoire.
Libérer(P)
Pour initialiser un pointeur, quel que soit son type, on utilise la valeur Nil.
Nom_Pointeur Nil
Cette initialisation a pour signification « ne pointe sur rien », elle est schématisée par une barre
oblique.
5 |8
P Nil
Nous allons constater l’importance de cette affectation, lors de la dernière partie de ce chapitre.
Le contenu d’une variable peut être recopié dans une autre variable pointeur par
l’intermédiaire de l’instruction d’affectation. La seule condition est que les deux pointeurs
soient de même type.
NomPointeur1 NomPointeur2 : a pour effet de recopier l’adresse contenue dans
NomPointeur2 dans NomPointeur1.
Si par la suite le contenu de NomPointeur2 est perdu, l’information pointée peut toujours être
retrouvée grâce à NomPointeur1.
Par exemple :
P, Q : ^Entier
Allouer(P)
P^ 4
6 |8
Q P
//ici P et Q pointent sur le même espace en
mémoire
Ecrire(Q^)
//revient à afficher la valeur 4
Deux pointeurs peuvent être comparés entre eux s’ils sont de même type. Les
opérations permises sont l’égalité et l’inégalité.
Par ailleurs la valeur Nil peut être comparée à toutes les variables pointeurs quelques
soient leurs types.
7 |8
la condition P=Q renvoie faux
mais P^=Q^ renvoi aussi vrai
Un pointeur peut aussi pointer sur un espace en mémoire de type enregistrement. Un champ
d’un enregistrement pointé par P_Enregistrement est désigné par :
P_Enregistrement^.Nom_champ
Exemple :
TYPE
Etudiant = Enregistrement
nom, prénom : Chaîne [20]
Fin Enregistrement
VARIABLE
P : ^Etudiant // P est un pointeur sur Etudiant
L’espace mémoire associé à l’enregistrement est désigné par : P^.
8 |8