Vous êtes sur la page 1sur 18

25/02/2021

1-Définition d’un pointeur


• Concrètement, chaque langage a sa propre
défini=on de pointeurs, mais en
Chapitre 1 programma=on, un pointeur est une variable
des=née à contenir une adresse mémoire.

Les Pointeurs
• Il peut être vu comme un « localisateur » : par
son contenu, le pointeur désigne (pointe sur)
l’emplacement physique d’une autre valeur

Cours ASD2 – ISET Charguia 2020/2021

1
prévenir une unique personne du changement : « La Poste ».

Question 25/02/2021
Comment gardez-vous un site intéressant sur Internet ?

Réponse
Via un « bookmark/signet » dans votre navigateur : c’est un lien vers l’information qui
vous intéresse.

Question
Et comment fait-on cela en programmation ?

Réponse
Pour faire la même chose et garder un lien vers une entité (une variable, fonction, etc.),
c.-à-d. en avoir une référence universelle, on utilise des pointeurs.

Pointeur

2-Représentation graphique
Élément informatique qui contient l’adresse d’un autre élément informatique. Il peut
être vu comme un « localisateur » : par son contenu le pointeur désigne (pointe sur) l’em- 3-Type du pointeur
placement physique d’une autre valeur (pointeur de donnée) ou d’une fonction (pointeur
de code). La valeur d’un pointeur est une adresse virtuelle.
• Si x désigne une variable, l’expression @x, qui • Un pointeur est typé : il est lié au type de
fournit graphique
Représentation l’adresse de x, est un pointeur ; l’en6té vers laquelle il pointe.
Si x désigne une variable, l’expression @x, qui fournit l’adresse de x, est un pointeur ; ici
@x pointe vers x. Si f ici @xune
désigne pointe vers
procédure x.
ou fonction, l’expression @f pointe vers le • Le type de la variable pointée est appelé le
début du code de la procédure ou fonction f.
type du pointeur ou type de base.

Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

2
25/02/2021

4-Déclaration d’un pointeur 5-La valeur Nil


• Variable p : ^T • La valeur Nil
Explication:
Déclare une variable p qui pointe vers une valeur de type T Not Iden1fied Link, elle désigne la valeur associée
au pointeur nul.
• Taille d’un type pointeur Elle peut être mémorisée dans toute variable
Le nombre d’octets de l’adresse est indépendante du type de l’entité pointeur, quel que soit son type.
référencée.
– Taille(Pointeur Caractère) = Taille(Pointeur Réel) = 4 octets par • U-lité de la valeur Nil
exemple Elle sert généralement à ini1aliser un pointeur
– (Taille(Caractère) = 1) <> (Taille(Réel) = 8) par exemple
quand on ne connaît pas l’adresse qu’il doit
• La déclaration d’une variable pointeur réserve les octets nécessaires contenir, ou à signaler l’échec d’une opéra1on ou
au codage d’une adresse mémoire mais ne réserve aucune l’appari1on d’une erreur ...
mémoire pour la donnée pointée.

Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

3
25/02/2021

La valeur Nil 6-L’opérateur d’adresse


• Représentation graphique • Désigne l’adresse mémoire de l’en6té
La valeur Nil est souvent représentée par: (variable, constante).
• @x

Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

4
25/02/2021

7-L’opérateur d’indirection L’opérateur d’indirection


• Il désigne le contenu de la valeur pointée par le • Lorsqu’un pointeur vaut Nil, il n’y a aucun sens
pointeur. de tenter d’accéder à la zone pointée.

• Opérateur d’indirection
p^ // avec p pointeur
• Ainsi l’instruc;on suivante produira un
comportement imprévisible si p vaut Nil
• Explication x <- p^ ????????
Renvoie la valeur pointée par le pointeur p, p^ est
une variable du type de la zone pointée.

Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

5
25/02/2021

Exemple 8-Affectation d’un autre pointeur


algorithme : Exemple_Opérateur_Adresse • L’affecta4on entre pointeurs est permise si les
Variables deux pointeurs ont le même type.
x : En:er • Exemple
p : ^En:er
Début Variables
xß 3 p, q : ^T
p ß @x // p pointe vers x Début
p^ ß p^ + 1 // incrémenta:on de x via p
Fin ……
• Remarque: à la fin de l’exécu:on, la variable x p ß q // p pointe vers la même zone que q
con:endra la valeur 4. Fin

Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

6
25/02/2021

9-Initialisation de pointeurs 10-Comparaisons entre pointeurs


• Un pointeur est un type élémentaire. Par • Les comparaisons concernant les pointeurs
conséquent les éléments de type pointeur ne sont réduites. Ainsi :
sont pas ini9alisés. – Deux variables pointeurs peuvent être comparées
• L’ini9alisa9on pourra s’effectuer par entre elles si et seulement si elles sont du même
l’affecta9on de : type. Dans ce cas, seules les opérateurs de
comparaison d’égalité = et d’inégalité <> ont un
• L’adresse d’une en9té @x. sens.
• Un autre pointeur du même type.
– La valeur Nil peut être comparée à toutes les
• La valeur Nil du pointeur nul.
variables pointeurs quels que soient leurs types.

Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

7
25/02/2021

11-Conclusion II-Arithmétique des pointeurs


• La valeur d’un pointeur étant un en8er. On peut lui
• Le test entre variables pointeurs ne permet de appliquer un certain nombre d’opérateurs arithmé8ques
classiques.
savoir que deux choses : • Les opéra8ons arithmé8ques valides sur les pointeurs sont:
– Si deux variables pointeurs pointent sur la même – l’addi&on d’un en8er à un pointeur.
variable pointée. – la soustrac&on d’un en8er à un pointeur.
– la différence de deux pointeurs p et q pointant tous les deux
– Si une variable pointeur mémorise Nil. vers des objets de même type.
• Le résultat est un en8er dont la valeur est égale à
(p-q)/Taille(type)

• Remarque importante: La somme de deux pointeurs n’est


pas autorisée.

Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

8
25/02/2021

Arithmétique des pointeurs Arithmétique des pointeurs


• Si k est un en3er et p est un pointeur sur un Exemple 1:
objet de type T.
Algorithme Exemple1
• L’expression ”p+k” désigne un pointeur sur un Variables
objet de type T dont la valeur est égale à la i : En:er
valeur de p incrémentée de k*Taille(T). p1,p2 : ^En:er
Début
• Il en va de même pour la soustrac3on d’un i←3
en3er à un pointeur p1←@i
p2←p1
Ecrire(”p1 =” , p1^ , ”et p2 =”, p2^)
Fin
Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

9
25/02/2021

Arithmétique des pointeurs III-Allocation Statique & Dynamique


Exemple 2:
• 1-Défini(on: L'alloca6on est dite sta(que car
Algorithme Exemple2
Variables décidée au moment de l'écriture de
pi : ^En;er l'algorithme et non évolu6ve lors de
pr : ^Réel
pc : ^Caractère l'exécu6on.
Début • 2-Conséquence :
pi^←4
(pi+1)^←5 Cela a de nombreux inconvénients car il n'est
pr^←45.7
pr←pr+1 pas possible de contrôler au mieux l'espace
pc^←’j’ mémoire disponible.
Fin

Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

10
25/02/2021

3-Inconvénients: Allocation Statique 4-Allocation dynamique


• Fréquemment aussi, dans le cas d'un vecteur (tableau), on • L’alloca4on dynamique est une alloca4on de
ne peut pas connaître, a priori lors de l'écriture de mémoire effectuée lors de l’exécu4on mais non
l'algorithme, le nombre d'éléments qu'il conBendra. CeEe
taille n'est parfois calculable ou donnée que pendant prévue lors de la compila4on
l'exécuBon du programme. • Ce=e alloca4on est à la charge du programmeur,
• La soluBon consistait à déclarer un vecteur d'une taille très il lui faut donc :
importante, qui occupait beaucoup d’espace mémoire – une fonc4on perme=ant de réserver une zone
parfois inuBlement. mémoire: allouer()
• Il est donc indispensable de disposer d'un mécanisme – une fonc4on perme=ant de libérer une zone
perme4ant de créer et de supprimer des variables de mémoire: liberer()
différents types pendant l'exécu9on.
• C'est ce qu'on appelle la ges9on dynamique (pendant – une variable (et donc un type) perme=ant de
l'exécuBon) de la mémoire. référencer ce=e zone mémoire allouée : le pointeur

Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

11
25/02/2021

DVD-MIAGE Pointeurs Algorithmique


Allocation / désallocation d'une zone de mémoire

Allocation dynamique On a défini un type t.


On déclare : ptr : pointeur_sur_t ou ^t.
Allocation dynamique
• La fonc2on ”Allouer”. Allouer(ptr)
Création d'une variable dynamique de type t
• réserve un emplacement mémoire de la
• Sa syntaxe est la suivante : allouer(ptr) taille correspondant au type t,
Allouer(ptr, nbr_objets) ! • met
réserve un emplacement mémoire dans
de la la variableauptr
taille correspondant type l'adresse
t, de la zone
! mémoire qui a été réservée.
met dans la variable ptr l'adresse de la zone mémoire qui ́ a été réservée.

• Si nbr_objets = 1 alors la syntaxe est la L'emplacement


L'emplacement pointé par ptr sera accessible par pointé
ptr^. par ptr sera accessible par ptr^.
suivante : ptr : ^t
ptr : ^t ptr
Allouer(ptr) allouer(ptr)

allouer(ptr) ptr ptr^ : t


Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

Libération de la place occupée par une variable dynamique

desallouer(ptr)

! libère la place de la zone mémoire dont l'adresse est dans ptr (et la rend disponible
pour l'allocation d'autres variables)
! laisse la valeur du pointeur en l'état (n'efface pas l'adresse qui est dans la variable
pointeur).

ptr ptr^ : t

desallouer(ptr)
ptr
12
Remarque : si on fait appel au pointeur désalloué, il renvoie une information qui n'a aucun
25/02/2021

Exemple 1 5-Libéra)on dynamique


Algorithme Exemple1
Variables
pi, pj : ^Entier
• La fonction ”Libérer”
pr : ^Réel • Lorsque l’on n’a plus besoin de l’espace
pc : ^Caractère mémoire alloué dynamiquement c’est-à-dire
Début
//réserver 10 octets mémoire, soit la place pour 10 caractères quand on n’utilise plus le pointeur ptr, il faut
Allouer(pc, 10) libérer cette place en mémoire.
//réserver un espace pour 4 entiers
Allouer(pi,4)
• Ceci se fait à l’aide de l’instruction ”Libérer”
//réserver un espace pour 6 réels qui a pour syntaxe :
Allouer(pr,6)
//réserver un espace pour 1 entier
Libérer(ptr)
Allouer(pj) // Par défaut le nombre d’objets est 1
Fin Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

13
25/02/2021
DVD-MIAGE Pointeurs Algorithmique
Allocation / désallocation d'une zone de mémoire
On a défini un type t.
On déclare : ptr : pointeur_sur_t ou ^t.

Création d'une variable dynamique de type t

allouer(ptr)

! réserve un emplacement mémoire de la taille correspondant au type t,


! met dans la variable ptr l'adresse de la zone mémoire qui a été réservée.

L'emplacement pointé par ptr sera accessible par ptr^.

ptr : ^t

allouer(ptr) Libéra'on dynamique


ptr
Exemple2
Algorithme Exemple2
ptr ptr^ : t
Variables
Libérer(ptr) pi : ^Entier
• Libère la place de la zone mémoire dont
Libération de la place occupée par une variable dynamique pr : ^Réel
Début
l'adresse est dans ptr (et la rend disponible
desallouer(ptr)
//réserver un espace pour 4 entiers
! pour
libère la l'alloca'on d'autres
place de la zone mémoire variables)
dont l'adresse est dans ptr (et la rend disponible Allouer(pi, 4)
pour l'allocation d'autres variables) //réserver un espace pour 6 réels
•! Laisse la valeur
laisse la valeur du pointeurdu pointeur
en l'état enl'adresse
(n'efface pas l’étatqui(n'efface
est dans la variable
Allouer(pr, 6)
pas l'adresse qui est dans la variable pointeur).
pointeur).
...
ptr ptr^ : t
//libérer la place précédemment réservée pour pi
Libérer(pi)
desallouer(ptr) Libérer(ptr) ptr
//libérer la place précédemment réservée pour pr
Libérer(pr)
Remarque : si on fait appel au pointeur
Cours ASD2 désalloué,
– ISET Charguia il renvoie une information qui n'a aucun
2020/2021 Fin Cours ASD2 – ISET Charguia 2020/2021
sens.

Chapitre 9 Page 2/4

14
25/02/2021

Libéra'on dynamique IV-Pointeurs et tableaux


Remarque : • Tout tableau est un pointeur constant.
A*en,on: Si on fait appel au pointeur désalloué • Dans les déclarations :
(Libéré), il renvoie une informa'on qui n'a aucun tab : Tableau de [1..10] d’Entier
sens. p : ^Entier

p←tab ⟺ p←@tab[1]
car tab prends l’adresse du premier élément du
tableau

Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

15
25/02/2021

Pointeurs et tableaux (suite) Exemple


• Les écritures suivantes sont équivalentes : tab : Tableau de [1..5] d’Entier
tab[3] ⟺ (p+3)^ p : ^Entier
i : Entier
• tab est un pointeur constant non modifiable ...
dont la valeur est l’adresse du premier p←tab
élément du tableau. Pour i de 1 à 5 faire
• Autrement dit tab a pour valeur @tab[1]. Ecrire(p^)
• On peut donc u+liser un pointeur ini+alisé à p←p+1
tab pour parcourir les éléments du tableau. Fin Pour

Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

16
25/02/2021

Exemple V-Pointeur et enregistrements


Ce qui est aussi équivalent à: • Il est bien sûr possible de déclarer un pointeur
sur un type structuré.
tab : Tableau de [1..5] d’En=er
p : ^En=er
... • Ainsi l'accès au champ se fera de la façon
p←tab suivante :
Pour p de tab à tab+4 faire (nom_pointeur^).champ_de_l_enregistrement
Ecrire(p^)
Fin Pour

Cours ASD2 – ISET Charguia 2020/2021 Cours ASD2 – ISET Charguia 2020/2021

17
25/02/2021

Exemple
Type Pays = Enregistrement
nom : chaine de caractères
nb_hab : En;er
FinEnregistrement

Algorithme Pointeur_Enregistrement

Variables
ppays : ^Pays
Début
Allouer(ppays)
Ecrire("Saisissez le nom du pays et sa popula;on")
Lire(ppays^.nom)
Lire(ppays^.nb_hab)
Ecrire("Vous avez saisi que le ", ppays^.nom," a " ,ppays^.nb_hab,"habitant(s)")
Libérer (ppays)
Fin
Cours ASD2 – ISET Charguia 2020/2021

18

Vous aimerez peut-être aussi