Les pointeurs
Introduction
• La mémoire centrale est composée d’un très grand nombre
d’octets.
• Chaque octet est repéré par un numéro appelé adresse.
Adresses 08 Bits (Octet)
@0
@1
@2
.
Mémoire
. centrale
@ n-2
@ n-1
• Chaque variable dans la mémoire occupe des octets contigus,
c'est-à- dire des octets qui se suivent.
Introduction (Exemple)
• float x;
• En C++ un float occupe 4 octets qui se suivent.
• L’adresse de la variable est l’adresse de son premier
octet.
• On peut connaître l’adresse d’une variable par
l’opérateur &.
Exemple
float x ;
p = &x; //l’adresse de la variable x : adresse de son premier
octet
La variable p contient une valeur qui est l’adresse de la
Allocation de la mémoire
• Les algorithmes (programmes) consomment
essentiellement deux ressources :
– Le temps d’exécution.
– L’espace mémoire réservé.
• On distingue deux types d'allocation (réservation) de
l’espace mémoire:
– Allocation statique
– Allocation dynamique.
Allocation statique
Allocation statique :
• L'allocation de l'espace mémoire se fait avant
l'exécution du programme, c'est-à-dire après la
compilation.
• Le cas de variables simples et de tableaux.
Exemple:
int x; // 4 octets
Réservation de 124
char S[20]; octets avant de
// 20 octets
démarrer l’exécution
float T[100]; // 4 * 100 octets
Allocation dynamique
• L'allocation de l'espace se fait au fur et à mesure de
l'exécution du programme.
• Pour pouvoir faire ce type d'allocation, l'utilisateur doit
disposer des deux opérations : allocation et libération de
l'espace.
• La majorité des langages de programmation offre cette
possibilité.
• Le système d’exploitation prévoir une partie de la MC à
cet effet appelée le TAS (table allocation system).
• Il faut toujours garder l’adresse de l’espace réservé
dynamiquement dans une variable de type pointeur
Pointeurs
• Définition: un pointeur est un variable qui stocke pour valeur une adresse
mémoire. Mémoire centrale
Exemple:
x= 17
P 1000
P un pointeur contenant l’adresse de x dans la mémoire
P= 1000
X 17 @=1000
• Déclaration: On déclare un pointeur d'un type donné en ajoutant le signe
* ou ^ ou le mot clé pointeur avant le type du pointeur.
Exemple:
P : *entier;
en c ou c++:
int * P;
Pointeurs
• Définition: un pointeur est un variable qui stocke pour valeur
une adresse mémoire.
Exemple:
x= 17
P un pointeur contenant l’adresse de x dans la mémoire
P= 1000 Mémoire centrale
P 1000
X 17 @=1000
Pointeurs
Déclaration:
• On déclare un pointeur d'un type donné en ajoutant le
signe * ou ^ ou le mot clé pointeur avant le type du
pointeur: <Nom de la variable> : * Type;
Exemple:
P : *entier;
Q: * réel;
• En c ou c++: Type * <Nom de la variable> ;
int * P;
float * Q;
Opérateurs &
• L'opérateur & sert à récupérer l'adresse mémoire
d'une variable.
int var = 4;
int *ptr;
ptr = &var;
cout<<"L'adresse de 'var' est :", ptr);
Opérateurs *
• Un pointeur contient une adresse en mémoire, et
grâce à l'opérateur *, on peut accéder à la valeur
contenue à cette adresse (soit pour la modifier, soit
pour l'examiner) :
Exemple:
int var = 5;
int *p;
p = &var;
cout<<"La valeur de 'var' est : "<<*p
Allocation dynamique
• L’instruction P Allouer (type): Allocation d’un espace
de taille spécifiée par le type de P. L’adresse de cet
espace est rendue dans la variable de type Pointeur P.
Exemple: allocation d’une zone mémoire pour un entier
P: * entier
P Allouer (entier)
• En c++: on utilise l’opérateur new (p = new type; )
Exemple: allocation d’une zone mémoire pour un entier
int *p;
p= new int;
Libération d’un espace mémoire
Libération d’un espace mémoire
L’instruction Libérer (p): libération de l’espace pointé par
P.
Exemple:
P: * réel
P Allouer (réel)
*P 15.5
Ecrire (*P)
Libérer (P);
En c++: on utilise l’opérateur delete (delete p;)
Pointeurs pour des enredistrement
Enregistrement pointé par un pointeur P
Pour accéder à un champ d’un enregistrement pinté par un pointeur
on utilise l’opérateur « -> » : P -> « champ »
Exemple:
Algorithme exemple
Type structure point
x: réel;
y: réel;
Fin
P: * point;
Début
P Allouer (point); // allocation de l’espace mémoire
P
P -> x 10.8;
@
P -> y 12.5;
Ecrire (p -> x); // affiche 10.8 x y
Libérer(p); //libération de l’espace mémoire 10.5 12.5
Fin