Pointers/fr

From Free Pascal wiki

English (en) français (fr) 日本語 (ja) 中文(中国大陆)‎ (zh_CN)

Tutoriel de Pascal Objet : Types de données / Pointeurs

Un pointeur est un type de données qui tient une adresse mémoire. Un pointeur peut être pensé comme une référence à cette adresse mémoire alors qu'une variable accède à cette adresse mémoire directement. Si une variable est le numéro de téléphone de quelqu'un alors un pointeur est la page et le numéro de ligne où il est listé dans l'annuaire. Pour accéder à la donnée enregistrée à l'adresse mémoire, vous déréférencez le pointeur.

Pour déclarer un type de donnée pointeur, vous devez spécifier sur quoi il pointe. Ce type de données doit être précédé par un accent circonflexe (^). Par exemple, si vous créez un pointeur sur un entier, vous devrez utiliser ce code :

type
  PointerType = ^integer;

Dès lors, vous pouvez bien sûr déclarer des variables de type PointerType. Avant d'accéder à un pointeur, vous réservez de la place en mémoire que vous accéderez par ce pointeur. C'est fait comme ceci :

New (PointerVariable);

Pour accéder à la donnée à l'emplacement mémoire du pointeur (le déréférencer), vous ajoutez un accent circonflexe après le nom de la variable. Par exemple, si PointerVariable était déclaré comme un type PointerType (du dessus), vous pouvez affecter à l'emplacement mémoire une valeur en utilisant :

PointerVariable^ := 5;

Après avoir terminé avec la donnée désignée par le pointeur, vous devez désallouer l'espace mémoire. Sinon, chaque fois que vous exécuterez le programme, il allouera de plus en plus de mémoire jusqu'à ce que votre ordinateur n'en ait plus. Pour désallouer la mémoire, vous utilisez la commande :

Dispose(PointerVariable);

Un pointeur peut être affecté à un autre pointeur. Toutefois, notez que depuis que l'adresse, pas la valeur, est en cours de copie, une fois que vous modifiez les données situées à un pointeur, l'autre pointeur, quand déréférencé, donne également les données modifiées. Aussi, si vous libérez (désallouez) un pointeur, le pointeur copié désigne des données incohérentes.

À quoi sont bons les pointeurs ? Pourquoi ne pouvez-vous pas simplement utiliser un entier dans les exemples ci-dessus au lieu d'un pointeur vers un entier ? Bien, l'exemple du dessus est clairement un exemple artificiel. Le vrai pouvoir des pointeurs est que, en conjonction avec les enregistrements, ils rendent possible les structures de données dimensionnées dynamiquement. Si vous avez besoin de stocker des articles d'un type de donnée dans un certain ordre, vous pouvez utiliser un tableau. Néanmoins, votre tableau a une taille prédéfinie. Si vous n'avez pas une taille suffisante, vous ne pourrez pas accueillir toutes les données. Si vous avez un tableau énorme, vous prenez beaucoup de mémoire quand parfois cette mémoire n'est pas utilisée.

Une structure de donnée dynamique, d'un autre côté, ne prend que la mémoire nécessaire. Ce que vous faites est de créer un type de données qui pointe sur un enregistrement. Après, cet enregistrement a ce type de pointeur dans un de ses champs. Par exemple, les piles et les files peuvent toutes être implémentées en utilisant cette structure de données :

type
  PointerType = ^RecordType;
  RecordType = record
    data : integer;
  next : PointerType;
end;

Chaque élément pointe sur le suivant. Le dernier dans la chaîne indique qu'il n'y a pas de suivant en donnant la valeur nil à son champ next.

Sommaire