Rappelons (cf cours première notion), qu'une adresse est un entier qui représente la position d'un octet en mémoire. Cet entier permet donc en particulier de repérer la position, ou autrement dit l'adresse, d'une plage mémoire (schéma).
En Pascal, un pointeur se déclare de la manière suivante:
Var NomDuPointeur : ^ Type;
où Type représente le type de donnée dont le pointeur contiendra l'adresse.
Exemple:
Type Ville = record Nom : String; CodePostal : Integer; End; Var PVille : ^Ville;
Dans cet exemple, la variable PVille est un pointeur sur une donnée de type Ville.
Une autre manière de déclarer un pointeur est de définir tout d'abord un type pointeur de la manière suivante:
Type PointeurSurType = ^ Type;
et de déclarer ensuite le pointeur comme une variable de ce type:
Var NomDuPointeur : PointeurSurType;
Avec l'exemple précédent cela donnerait:
Type Ville = record Nom : String; CodePostal : Integer; End; PointeurSurVille = ^ Ville; Var PVille : PointeurSurVille;
Un pointeur permet de créer une variable sans nom, repérée uniquement par l'adresse qu'il contient.
Cette variable est créé par un mécanisme d'allocation dynamique de mémoire, que nous allons décrire à présent.
Les variables générées dynamiquement sont stockées dans une zone spéciale de la mémoire appelée le tas (heap en anglais).
En Pascal, l'allocation dynamique de mémoire se fait grace à l'opérateur new.
Si p est un pointeur sur un type T, new(p) va allouer de la place mémoire dans le tas pour une variable de ce type et affecter à p l'adresse de cette variable.
Avec notre exemple précédent, new(p) réserverait de la place pour une structure de type Ville et affecterait l'adresse de cette structure à p. Par exemple, si la plage mémoire réservée pour la structure commence à l'adresse 1961, p contiendra cette adresse (schéma).
Une fois que la variable est créé, il est possible d'y accéder par l'opérateur ^. Si p est un pointeur, p^ représente la variable pointée par p.
Avec notre exemple, pour affecter 'Strasbourg' au nom de la ville pointé par p on écrirait:
p^.Nom := 'Strasbourg';
Tout se passe donc comme si p^ était une variable de type Ville.