CHAPITRE 1
POINTEURS ET ALLOCATION DYNAMIQUE
1
QU’EST CE QU’UN POINTEUR?
Un pointeur en programmation est une
variable qui contient l’adresse mémoire
d’une autre variable.
2
ILLUSTRATION D’UN POINTEUR
3
QUELS SONT LES T YPES DE POINTEURS?
A chaque type de variable correspond un type
de pointeur (Même si en réalité un pointeur
contiendra toujours une adresse sous forme
d’entier).
On peut même envisager des pointeurs sur
des fonctions…
4
POURQUOI UTILISER LES POINTEURS?
Il est souvent plus efficace en terme de temps
d’exécution et de consommation mémoire de
passer les données entre les différentes partie
(fonctions) d’un programme en utilisant les
pointeurs.
Les pointeurs permettent de faire le passage
par variable (ou par adresse) des paramètres
d’une fonction.
5
POURQUOI UTILISER LES POINTEURS?
Une fonction peut retourner plusieurs valeurs
en utilisant les pointeurs.
Les pointeurs permettent l’implémentation de
types de données avancés comme les listes
chaînées et les piles.
6
OPÉRATIONS SUR LES POINTEURS
DÉ C LA RATION D’UN P OI N T EUR
Pour déclarer un pointeur, il suffit d’écrire de
précéder son nom par *. Par exemple:
*nom_pointeur:type
*ptr1, *ptr2 : type
7
OPÉRATIONS SUR LES POINTEURS
RÉ F É RE NCEM ENT
Le référencement ou affectation d’une adresse
à un pointeur peut se faire de plusieurs façons:
nom_pointeur <- &variable (l’opérateur & se
lit adresse de)
nom_pointeur1 <- nom_pointeur2
nom_pointeur <- NULL
Allocation dynamique
8
OPÉRATIONS SUR LES POINTEURS
D É R É F É R ENC EMENT
Le déréférencement permet l’accès, à partir
d’un pointeur, à la valeur de la variable sur
laquelle il pointe.
Le déréférencement se fait principalement à
travers l’utilisation de l’opérateur *. Par
exemple:
val <- *nom_pointeur
9
OPÉRATIONS SUR LES POINTEURS
I N C RÉ MENTATI ON DE P OI N T EURS
Attention:
Incrémenter un pointeur par une valeur « i »
revient à incrémenter sa valeur (qui est
l’adresse d’une autre variable) par i fois la
taille du type de la variable sur laquelle il
pointe.
10
OPÉRATIONS SUR LES POINTEURS
I N I T IALISATION DE S P OI N TE URS
Lorsqu’un pointeur est déclaré pour la première
fois, il contiendra une valeur entière et pointera
très probablement vers une zone mémoire qui
n’appartient pas à votre programme.
Il est donc impératif d’initialiser un pointeur
avant de l’utiliser.
A défaut d’initialisation en temps de compilation,
il vaut mieux initialiser le pointeur à NULL (nulle
part) et lui affecter une adresse mémoire
dynamiquement en temps d’exécution.
11
ALLOCATION DYNAMIQUE
Pour allouer une variable dynamiquement en temps
d’exécution il faut:
Déclarer un pointeur qui recevra l’adresse de cette
variable:
*ptr : type
Réserver dynamiquement une zone mémoire et
affecter son adresse au pointeur en question:
ptr <- allouer(taille en octet)
RQ. la fonction taille(TYPE) retourne le nombre d’octets
nécessaires à l’allocation mémoire d’une variable de type
TYPE.
Contrairement à l’allocation statique il faut penser à
libérer l’espace mémoire alloué une fois qu’on en a
plus besoin:
libérer(ptr) 12
POINTEURS ET TABLEAUX
Les tableaux peuvent être manipulés en
utilisant les pointeurs. Soit tab un tableau de
type, on aura dans ce cas:
tab est un pointeur sur son premier élément.
taille(tab) retourne la taille de tout le tableau.
tab <- allouer(taille) est valide pour toutes les
tailles multiple de la taille de type.
tab <- réallouer(taille) permet de modifier
dynamiquement la taille du tableau en plus ou
en moins.
13