Pointer/fr

From Free Pascal wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Deutsch (de) English (en) suomi (fi) français (fr) русский (ru)

Généralités sur les pointeurs

Ce que sont les pointeurs :

  • Un pointeur est une référence à un emplacement mémoire.
  • Un pointeur est du type de données entier qui stocke une adresse de mémoire.
  • Un pointeur désigne le premier octet d'une variable ou un objet.
  • La taille d'un pointeur dépend du processeur et du système d'exploitation, soit 4 ou 8 octets.

Exemple:

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 :

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-icon.png

Avertissement: 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 :

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é :

var
   ptr2: Pointer;

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

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.

  • Pour les type caractères :
    • PChar (Pointeur pour le type de donnée Char)
    • PAnsiChar (Pointeur pour le type de donnée AnsiChar)
    • PWideCahr (Pointeur pour le type de donnée WideChar)
    • PUnicodeChar (Pointeur pour le type de donnée UnicodeChar)
  • Pour les types entiers non signés :
    • PByte (Pointeur pour le type de donnée Byte)
    • PWord (Pointeur pour le type de donnée Word)
    • PDWord (Pointeur pour le type de donnée DWord)
    • PCardinal (Pointeur pour le type de donnée Cardinal)
    • PLongword (Pointeur pour le type de donnée Longword)
  • Pour les types entiers signés :
    • PShortint (Pointeur pour le type de donnée Shortint)
    • PSmallint (Pointeur pour le type de donnée Smallint)
    • PInteger (Pointeur pour le type de donnée Integer)
    • PLongint (Pointeur pour le type de donnée Longint)
    • PInt64 (Pointeur pour le type de donnée Int64)
  • Pour les types réels flottants :
    • PSingle (Pointeur pour le type de donnée Single)
    • PDouble (Pointeur pour le type de donnée Double)
    • PExtended (Pointeur pour le type de donnée Extended)
    • PComp (Pointeur pour le type de donnée Comp)
    • PCurrency (Pointeur pour le type de donnée Currency)

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

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

Allocation et libération de mémoire :

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:

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)

Types de données
Types de données simples Boolean | Byte |Cardinal | Char | Currency | Extended | Int64 | Integer | Longint | Pointer | Real | Shortint | Smallint | Word
Types de données complexes Array | Class | Record | Set | String | ShortString