Sign in Join
Wiki copytemporary

Revision 1 of 2, by Trev on 2-23-2020. The page as it is now.

Pointer/fr

\

Généralités sur les pointeurs

Ce que sont les pointeurs :

Exemple:\

pascal
var
   ptr1: ^Integer;  // typé
   ptr2: Pointer;   // non typé

Travailler avec des pointeurs typés est plus rapide qu'avec des pointeurs non typés.
Cependant les pointeurs non typés sont plus flexibles car non liés à un type particulier.
==Pointeur typé== Exemple d'utilisation d'un pointeur typé sur un type de donnée simple :

pascal
var
  a, b: Integer;  // "a" et "b" sont des variable de type Integer.
  p: ^Integer;    // "p" est un pointeur, il peut accueillir l'adresse d'une variable du type Integer.
begin
  a := 500;       // Affectation d'une valeur correcte à la variable "a".
  p := @a;        // La variable "p" de type Pointer reçoit maintenant l'adresse qui a été attribuée à la variable "a".
  b := p^;        // La variable "b" de type entier récupère la valeur à l'adresse données par "p" soit celle de la variable "a".
  p := nil;       // La variable "p" ne référence dorénavant plus rien.
                  // Le pointeur "p" pourra désigner une nouvelle adresse de mémoire.
end;

Warning: Tout tentative d'accès à l'espace mémoire via un pointeur valant Nil provoque une erreur à l'exécution.

Exemple d'utilisation d'un pointeur typé sur un enrtegistrement :

pascal
type
   TNewRecord = record
      Wert1: ShortString;
      Wert2: ShortString;
      Wert3: ShortString;
   end;
var
   p: ^TNewRecord;
begin
   New(p);                      // Allocation de mémoire pour un variable de type TNewRecord.
   p^.Wert1 := 'Test';          // Affectation d'un champ de donnée du TNewRecord par le pointeur.
   p^.Wert2 := 'TestTest';      // Affectation d'un champ de donnée du TNewRecord par le pointeur.
   p^.Wert3 := 'TestTestTest';  // Affectation d'un champ de donnée du TNewRecord par le pointeur.
   Dispose(p);                  // Libération de la mémoire allouée au TNewRecord.
                                // Les valeurs des champs de données sont alors perdues.
end;

Pointeur non typé

Exemple de définition d'un pointeur non typé :

pascal
var
   ptr2: Pointer;

Nouvelle allocation et libération de la mémoire :\

pascal
begin
  ...
  GetMem(ptr2,4);          // Integer est de 32 Bit, donc une taille de 4 octets
  Integer(ptr2^) := 2048;  // Affectation de la valeur
  FreeMem(ptr2);           // Libération de la mémoire
  ...
end;

Types de pointeurs typés prédéfinis

Il existe, par exemple dans Free Pascal et autres, les pointeurs prédéfinis suivants.

Exemple de définitions de pointeurs typés:
Exemple 1:

pascal
var
  ptr1: ^Integer;  // créé un pointeur typé pour le type de donnée Integer

Allocation et libération de mémoire :

pascal
begin
  ...
  New(ptr1);     // Réserve un emplacement de mémoire pour stocker sa valeur
  ptr1^ := 1;    // Affecte la valeur à l'emplacement mémoire
  Dispose(ptr1)  // libère la mémoire pour un usage ultérieur
                 // ce qui veur dire que la valeur est perdue
  ...
end;

Exemple 2:

pascal
function funTest: string;
var
  ptrZeiger: PInteger; // Type prédéfini de pointeur sur Integer dans Free Pascal
  { on pourrait déclarer de manière équivalente : ptrZeiger: ^Integer }
  intZahl: Integer; 
begin

  result:= '';
  intZahl := 4;  // une valeur pour la variable

  ptrZeiger := @intZahl; // le pointeur désigne maintenant la variable IntZahl
  result := Inttostr(ptrZeiger^); // Retourne la valeur désignée par ptrZeiger soit aussi celle de intZahl.

end;

Liens externes

Pour comprendre la notion de pointeur, vous pouvez lire cette excellente introduction aux pointeurs (fr)


From the Free Pascal wiki, page "Pointer/fr", as it stood on 2020-02-23 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.