Basic Pascal Tutorial/Chapter 5/Pointers/fr

From Lazarus wiki
Revision as of 00:26, 22 March 2014 by E-ric (talk | contribs) (Created page with "{{Pointers}} 5F - Pointeurs (auteur: Tao Yue, état: traduit) Un pointeur est un type de donnée qui tient une adresse mémoire. Un pointeur peut être pensé comme une réf...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

български (bg) English (en) français (fr) 日本語 (ja) 中文(中国大陆)‎ (zh_CN)

5F - Pointeurs (auteur: Tao Yue, état: traduit)

Un pointeur est un type de donnée 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, vvous devez spécifier sur quoi il pointe. Ce type de donnée 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.

A 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ée taillée 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ée 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ée:

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.

précédent table des matières suivant