intro_cpp_5.pdf

(84 KB) Pobierz
Notion d’indirection (1)
1
Illustration 1:
Pourquoi garder une copie des fichiers postscript du cours
dans mon répertoire, si je sais où se trouve l’original sur le web ?
pour accéder à l’original au cas où je n’ai pas de connexion internet.
Il n’y a pas vraiment d’autre bonne raison pour conserver une telle copie:
cela occupe inutilement de la place dans mon répertoire, et je ne verrai
pas les éventuelles mises à jour ou correctifs apportés au cours.
Une meilleure solution est donc que je ne garde
que
le
lien
vers
la page web du cours.
1. Adaptation du cours de M. Uwe Nestmann (LAMP-DI-EPFL)
Informatique II
Introduction à C++ (V)
–1–
Notion d’indirection (2)
Illustration 2:
Chacun d’entre vous a certainement déjà connu les joies d’un
déménagement, et les difficultés pour informer du changement d’adresse toutes
les personnes qui vous envoient du courrier.
2
Une idée qui fait son chemin depuis quelques temps est de fournir
à tout le monde une
adresse unique invariante,
attribuée par exemple par la Poste,
cette dernière se chargant ensuite d’acheminer le courrier à votre domicile:
en cas de déménagement, il n’y a que la Poste à informer,
et vous retrouver immédiatement tout votre courrier.
Les éléments communs à ces deux exemples sont
les notions
d’adresses
(URL et de domicile) et
d’indirection.
La réalisation informatique de ces deux notions passe par le concept de
pointeur.
2. A part, bien sur, ceux qui envoient des factures !
Informatique II
Introduction à C++ (V)
–2–
Pointeurs (1)
Que se passe-t-il lorsque l’on déclare une variable ?
int
main()
{
int
i;
i
= 53;
...
}
Le petit programme ci-dessus consiste en une définition de fonction (main), dans laquelle
une variable (i) est déclarée, puis se voit affectée la valeur 53.
Lors de la compilation, un espace est réservé dans la mémoire pour représenter
la variable
i;
la taille de cet espace est imposée par le type de la variable, mais
sa position dans la mémoire est à la discrétion du compilateur.
Il en va de même pour la fonction
main,
dont la transcription en une séquence
d’instructions machines est également logée
quelque part
en mémoire.
Lors de l’exécution du programme, les instructions constituant la fonction
main
sont exécutées, et, en particulier, celle qui placera le littéral
53
dans l’espace
mémoire représentant la variable
i.
i
0
20
21
22
23
24
25
26
27
...
2
4
6
53
8
i
= 53
...
main()
Informatique II
Introduction à C++ (V)
–3–
Pointeurs (2)
Cependant, le processeur ne manipule pas directement les identificateurs:
• les identificateurs «i» et «main» n’existent en fait que pour l’écriture
du programme: ce sont des
identificateurs
logiques,
créés par et pour le
programmeur.
20
21
22
23
24
25
26
27
...
i
0
2
4
6
53
8
l’identificateur
interne
d’une élément (variable, fonction, ...) tel qu’il est
manipulé par le processeur est tout simplement
l’adresse mémoire
de cet
élément; cette adresse est générée par le compilateur
3
(lors de la compilation
du programme).
i
= 53
...
On pourrait donc penser que les adresses mémoire sont des éléments
internes sans véritable intérêt pour la programmation. C’est en partie
vrai, mais dans certaines situations particulières (cas de collections
hétérogène par exemple), il peut s’averer nécessaire de manipuler,
au sein du programme, les adressesmémoires de certains éléments.
Ceci se fait à l’aide de variables d’un type particulier:
les pointeurs.
3. Et l’éditeur de lien.
main()
logique
interne
i
216
main
242
Informatique II
Introduction à C++ (V)
–4–
Pointeurs (3)
D’une façon générale, un pointeur est une variable permettant de
stocker l’adresse mémoire d’un élément du programme
En C++ cependant, la définition d’un pointeur doit de plus
comporter l’indication du type des éléments dont il va
pouvoir stocker les adresses mémoires.
Ce type sera appelé le type de base du pointeur.
La syntaxe de la déclaration d’un pointeur sera alors:
[const] <type de base>* <id. du pointeur>[(<valeur initiale>)];
Exemple:
int main()
{
int* ptr;
...
}
le type d’un pointeur vers des éléments
de type
T
est donc de la forme
T*
Informatique II
Introduction à C++ (V)
–5–
Zgłoś jeśli naruszono regulamin