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 rappelezvous 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 celuici 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
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 rappelezvous 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 celuici 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
