Vous êtes sur la page 1sur 8

CHAPITRE 1: LES POINTEURS

Matière: Algorithmique avancé


Enseignante: Mme Ahlem TAYACHI
Classe : MPI_1_1 & GL & BI

Dans ce chapitre, nous allons présenter des notions fondamentales en programmation


dynamique, la notion des pointeurs et les variables dynamiques.

I. Rappel sur les structures statiques

Les types de variables connus en algorithmique de base sont les suivants :

 Les types de base : Entier, Réel, Caractère, Booléen



 Les types dimensionnés tels que les tableaux

 Les types enregistrements, appelés aussi structures

Chaque type de base réserve un nombre bien défini de cases en mémoire. La


déclaration d’une variable fixe son type et détermine l’ensemble de valeurs admises pour cette
variable, le nombre d’octets réservé en mémoire et les opérateurs qui peuvent lui être
appliqués. De telles variables dites statiques.

Par exemple :

a, b, c : Entier

T : Tableau [1..10] de Réel

Personne=Enregistrement

Nom : chaîne [20]

Prénom : chaîne [20]

Age : Entier

Fin Enregistrement

Une variable statique est caractérisée par les propriétés suivantes :

 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é.

II. Les pointeurs


Une structure dynamique est une structure dont la taille peut varier au cours du
programme, par exemple les listes, les piles, les filles, …etc. L’allocation ou la réservation se
fait au fur et à mesure des besoins.

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

II.1. Définition d’une adresse

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.

II.2. Définition d’un pointeur

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.

II.2.1. Déclaration d’un pointeur

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.

Donc P et Q initialement ne contiennent ne pointent sur aucune variable pointée (espace


mémoire), ils attendent l’allocation dynamique.

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.

L’instruction utilisée pour créer ou allouer un espace mémoire est : Allouer(Nom_Pointeur)

Cette instruction exécute deux tâches :

 Réserve un espace en mémoire de la taille adéquate pour la variable pointée par


NomPointeur,

 Récupère l’adresse du bloc et l’affecte à la variable NomPointeur.

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

Par exemple : P^ désigne la variable pointée par P.

P : ^ Entier

P initialement ne contient aucune adresse


Allouer(P)

P pointe sur l’espace ayant l’adresse 90, une fois cet espace
est alloué.

4 |8

P^ 5

On a stocké, dans l’espace mémoire alloué, la valeur 5, c’est


la variable dynamique

II.2.3. Libération de l’espace dynamique

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)

P n’est plus lié à un espace, il ne pointe sur rien.

II.3. Opérations sur les pointeurs

II.3.1. Initialisation d’un pointeur

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.

II.3.2. Affectation des pointeurs

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

//stocker dans la variable pointée le valeur 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

II.3.3. Comparaison de pointeurs

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.

Soient les pointeurs P et Q de même type :

 Si (P=Q) alors P et Q pointent sur la même case mémoire, c’est-à-dire ils


contiennent la même adresse en mémoire.

 Si (P^=Q^) alors le contenu des variables pointées par P et Q est le même.

P et Q pointent sur le même espace donc :

 la condition P=Q renvoie vrai



 et P^=Q^ renvoi aussi vrai

P et Q ne pointent pas sur le même espace donc :

7 |8
 la condition P=Q renvoie faux

 mais P^=Q^ renvoi aussi vrai

II.3.4. Pointeur et enregistrement

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

Par exemple le champ Nom est accessible par : P^.nom

8 |8

Vous aimerez peut-être aussi