1. Les variables dynamiques ou pointeurs
n rapelle que pendant l'exécution d'un programme, une donnée particulière est contenue dans une case mémoire située dans la mémoire centrale. Chaque case mémoire est associée (ou repérée) par un nombre entier dénommé son adresse. Ci-dessous 3 mémoires contenant chacune une donnée (figurée en rouge) et repérée par son adresse
La notion de pointeurs est très commode dans les langages de programmation, car elle permet de représenter simplement des structures de données dynamiques comme les piles, les files, les listes, les arbres etc...
Toutefois le revers de la médaille se situe dans la trop grande
proximité d'un pointeur avec le bas niveau, celui de la machine,
ce qui nuit à l'abstraction du programme ! C'est pourquoi si les
pointeurs sont présents dans le pascal, le C, le C++, ils ont été
éliminés dans Java et remplacés par des références
qui sont des encapsulations de pointeurs (Delphi travaille essentiellement
avec des références mais autorise l'utilisation de pointeurs).
outes les variables de base en pascal sont de type statique, le type pointeur permet l'utilisation de variable dynamique. Il existe donc en pascal un constructeur de type pointeur c'est un identificateur de type précédé d'une flêche "^"
Syntaxe :
Exemple de déclaration :
Type
Pentier = ^integer ;Nous avons déclaré 4 types de variables pointeurs : Pentier qui pointe vers une variable de type integer, PString qui pointe vers une variable de type string, PTable qui pointe vers un tableau d'integer, PEnregistr qui pointe vers un enregistrement (record).
PString = ^string ;
PTable = ^Table ;
Table = Array[1..10] of integer ;
PEnregistr = ^Enreg ;
Enreg = record
nom, prenom :string ;
age : 1..100 ;
end;
eprenons dans un programme
pascal les types déclarés ci-haut :
Le programme
pascal
|
|
program LesPointeurs ;
Type Pentier = ^integer ; PString = ^string ; PTable = ^Table ; Table = Array[1..10] of integer ; PEnregistr = ^Enreg ; Enreg = record nom, prenom :string ; age : 1..100 ; end; var x : Pentier ; y : PString ; t : PTable ; z : PEnregistr ; begin x^ := 12 ; y^ := 'abcde' ; t^[1] := -1 ; t^[2] := -2 ; ...... t^[10] := -10 ; z^.nom := 'package' ; z^.prenom := 'pédagogique' ; z^.age := 3 ; end. |
uelques exemples de déclaration
de structures de données dynamiques représentées par
des pointeurs en pascal.
Voici une implantation possible de la liste unidirectionnelle en pascal : type ListeUni = ^cell ; cell = record elt : string ; suite : ListeUni ; end ; |
Voici une implantation possible de la liste bidirectionnelle en pascal : type ListeBi = ^cell ; cell = record avant : ListeBi ; elt : string ; suite : ListeBi ; end ; |
un arbre binaire Voici une implantation possible d'un arbre binaire en pascal : type Arbre = ^noeud; noeud = record elt : string ; filsg, filsd : Arbre ; end ; |
'assistant propose un exemple de liste linéaire chaînée (unidirectionnelle) et deux exercices testant votre compréhension de l'écriture de cette structure de données en pascal.
L'exemple :
Les deux exercices portent sur la même structure figurée
ci-dessous, il vous est demandé de répondre à des
questions sur cette structure de liste:
l'image de tous les exercices précédents, l'assistant vous indiquera auditivement et visuellement la justesse de votre réponse.