Difference between revisions of "Basic Pascal Tutorial/Chapter 5/Pointers/fr"

From Lazarus wiki
Jump to navigationJump to search
(Refonte)
Line 1: Line 1:
 
{{Pointers}}
 
{{Pointers}}
  
5F - Pointeurs (auteur: Tao Yue, état: traduit)
+
[[Object Pascal Tutorial/fr|Tutoriel de Pascal Objet]] : Types de données / '''Pointeurs'''
  
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.
+
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, vvous devez spécifier sur quoi il pointe.
+
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 :
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:  
 
 
<syntaxhighlight>
 
<syntaxhighlight>
 
type
 
type
Line 12: Line 11:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Dès lors, vous pouvez bien sûr déclarer des variables de type <tt>PointerType</tt>.
+
Dès lors, vous pouvez bien sûr déclarer des variables de type <tt>PointerType</tt>. 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 :
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:
 
 
<syntaxhighlight>
 
<syntaxhighlight>
 
New (PointerVariable);
 
New (PointerVariable);
 
</syntaxhighlight>
 
</syntaxhighlight>
  
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 <tt>PointerVariable</tt> était déclaré comme un type <tt>PointerType</tt> (du dessus), vous pouvez affecter à l'emplacement mémoire une valeur en utilisant:
+
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 <tt>PointerVariable</tt> était déclaré comme un type <tt>PointerType</tt> (du dessus), vous pouvez affecter à l'emplacement mémoire une valeur en utilisant :
 
<syntaxhighlight>
 
<syntaxhighlight>
 
PointerVariable^ := 5;
 
PointerVariable^ := 5;
 
</syntaxhighlight>
 
</syntaxhighlight>
  
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:
+
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 :
 
<syntaxhighlight>
 
<syntaxhighlight>
 
Dispose(PointerVariable);
 
Dispose(PointerVariable);
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Un pointeur peut être affecté à un autre pointeur. Toutefois, notez que depuis que l&apos;'''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.  
+
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,  
+
À 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.
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:
+
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 :
 
<syntaxhighlight>
 
<syntaxhighlight>
 
type
 
type
Line 46: Line 42:
 
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 <tt>nil</tt> à son champ <tt>next</tt>.
 
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 <tt>nil</tt> à son champ <tt>next</tt>.
  
{|style=color-backgroud="white" cellspacing="20"
+
{{Tutorial page navigation/fr|Records|Final words}}
|[[Records/fr|précédent]] 
 
|[[Contents/fr|table des matières]]
 
|[[Final_words/fr|suivant]]
 
|}
 

Revision as of 14:44, 27 October 2015

български (bg) 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