Un pointeur est une variable qui stocke l'adresse (c.a.d la position en memoire) d'une variable.
Supposons une liste de 3 entiers. On suppose connaitre pour
chacun l'adresse du suivant :

Pour representer un arbre, il suffit pour chaque element de connaitre l'adresse de chaque fils :
En pascal, on utilise les pointeurs pour representer ces objets. La declaration se fait de la maniere suivante :
TYPE pointeur=^type_de_la_variable_pointee
ex : TYPE tpoint=^tval; (* pointe sur des TVAL *)
tval=record
valeur:integer;
suivant:tpoint
end;
VAR p1,p2:tpoint;
Dans cet exemple, les variables de type TVAL contiendront un entier et
l'adresse de la suivante (liste chainee vue plus haut).Contrairement aux tableaux, il n'est pas necessaire de prevoir le nombre de variables pointees a l'avance. C'est "l'allocation dynamique de memoire" : on reserve la place pour chaque variable en cours d'execution du programme, par la commande NEW(nom_variable). On recupere la place, si la variable est devenue inutile, par DISPOSE(nom_variable).
P1 contient donc une adresse d'une variable de type TVAL. Cette variable sera P1^ (c.a.d pointee par P1). On la "remplit" donc par des affectations du type :
P1^.valeur:=15; P1^.suivant:=P2;
Examinons un programme qui lit puis affiche une liste chainee d'entiers :
program liste(input,output);
TYPE tpoint=^tval;
tval=record
valeur:integer;
suivant:tpoint
end;
VAR prem,precedent,point:tpoint;
i,n:integer;
begin
write('combien d''elements comporte votre liste ?');
readln(n);
new(prem); (* le 1er est particulier : si on le perd, on perd la liste *)
write('1ere valeur ? ');
readln(prem^.valeur); (* lecture de l'enregistrement VALEUR
de la variable d'adresse (pointee par) PREM *)
precedent:=prem;
for i:=2 to n do begin
new(point); (* creation d'une nouvelle variable *)
write(i,'ieme valeur ? ');
readln(point^.valeur);
precedent^.suivant:=point; (* mise a jour du chainage *)
precedent:=point (*se preparer pour la prochaine boucle*)
end;
precedent^.suivant:=NIL;
(* NIL signifie "rien" car 0 est un entier, non une adresse *)
point:=prem; (* heureusement, on se souvient du premier *)
for i:=1 to n do begin
writeln(point^.valeur);
point:=point^.suivant (* pour la prochaine boucle *)
end
end.
EXERCICE (pointeurs) modifier ce programme pour qu'il permette de
rajouter ou supprimer des elements. Decomposez le en
routines.