art :tarticle 
pArt :pointeur sur tarticle 
Début 
art.ref←"ref01001" 
pArt←adresse de art 
Afficher (*pArt).ref // on trouve aussi la notation pArt→ref 
Fin
En commentaire, il est indiqué que la notation pArt→ref est aussi utilisée, avec une flèche indiquant qu’on pointe sur 
l’enregistrement ref de la structure pointée. Cette notation est issue des langages C et C++ qui font la différence 
entre  une  variable  structurée  (utilisation  du  point  pour  l’accès  aux  champs),  et  un  pointeur  sur  une  variable 
structurée (utilisation de la flèche). Dans le doute, vous pouvez aussi procéder ainsi : 
Afficher pArt→ref 
Afficher (*pArt).ref
Les deux syntaxes sont équivalentes car rappelez­vous que l’étoile déréference le pointeur : on récupère la valeur de 
la variable pointée, et donc ici l’équivalent de la variable art originale. 
b. Allocation dynamique 
Jusqu’à présent les pointeurs recevaient l’adresse d’une variable qui existait déjà par affectation. Il est aussi possible 
de réserver un emplacement mémoire pour une donnée pointée directement. Dans ce principe, vous pouvez créer un 
pointeur sur un entier par exemple, et réserver un espace mémoire qui contiendra cet entier, sur lequel la variable 
pointeur pointera. C’est le principe de l’allocation dynamique de mémoire. Il vous faut employer la syntaxe suivante : 
pointeur←nouveau type
Le type doit bien entendu être celui de la valeur qui sera contenue à l’emplacement mémoire réservé. Après cette 
instruction, le pointeur reçoit l’adresse mémoire de la zone réservée. En cas d’échec (plus de mémoire disponible par 
exemple) il reçoit la valeur NIL. 
Dans  l’exemple  suivant,  un  pointeur  sur  un  entier  est  déclaré.  Voulant  placer  une  valeur  entière  dans  la  zone 
mémoire pointée, il faut d’abord réserver l’emplacement nécessaire. Puis via l’utilisation de l’étoile devant le nom du 
pointeur, on y place un entier. 
Programme alloc 
Var 
pEntier :pointeur sur entier 
Début 
pEntier←nouveau Entier 
*pEntier←12345 
Afficher *pEntier 
Fin
Dans la plupart des langages disposant de pointeurs, il est possible de préciser la taille de la mémoire allouée, par 
exemple  allouer  un  espace  pour  dix  entiers.  Dans  ce  cas,  c’est  l’équivalent  d’un  tableau  d’entiers,  et  l’adresse 
retournée sera celle du premier entier. Ajouter un au pointeur décalera celui­ci d’un élément. Cette syntaxe n’est pas 
utilisée en algorithmique où on préfère allouer la mémoire élément par élément, quitte à les chaîner ensuite. 
Quand vous allouez dynamiquement de la mémoire, elle reste occupée tout le temps de l’existence du pointeur. Sans 
rien  d’autre,  la  mémoire  est  récupérée  uniquement  à  la  sortie  du  programme.  Il  est  aussi  facile  d’allouer  de  la 
mémoire que de la libérer, ou de la désallouer (un barbarisme bien utile) à volonté : dès que le ou les pointeurs ne 
sont plus utiles, on libère la mémoire associée, c’est ça de gagné. Pour ceci vous utiliserez la syntaxe suivante : 
Libé rer pointeur
Quand vous libérez le pointeur, vous libérez la zone mémoire sur laquelle il pointait, zone qui redevient disponible 
pour toute autre utilisation. Attention ! Si vous avez conservé dans un autre pointeur l’adresse de cette zone et que 
vous l’avez désallouée, ce pointeur pointe sur une zone éventuellement réaffectée à autre chose. Y accéder risque de 
fournir  une  valeur  arbitraire,  y  écrire  risque  d’occasionner  des  problèmes,  voire  des  plantages.  Le  mieux  est  de 
replacer une valeur NIL après la libération, et de penser à tester le pointeur avant de l’utiliser. 
  Ne  déréférencez  jamais  un  pointeur  dont  la  zone  mémoire  a  été  libérée.  C’est une faute malheureusement 
courante. Dans de très gros programmes le programmeur oublie parfois de tester la valeur du pointeur avant 
d’y accéder, provoquant une fuite mémoire aux conséquences souvent lourdes. 
- 7 -
© ENI Editions - All rigths reserved - Jonifar lina
169
Précédent

- 169/220

Suivant