Difference between revisions of "Pointer/fr"
m |
|||
Line 1: | Line 1: | ||
{{Pointer}} | {{Pointer}} | ||
+ | <br/> | ||
+ | __TOC__ | ||
− | Un pointeur est un type particulier de données | + | =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 un type de données entier pour stocker 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:<br/> | ||
+ | <syntaxhighlight> | ||
+ | var | ||
+ | ptr1: ^Integer; // typé | ||
+ | ptr2: Pointer; // non typé | ||
+ | </syntaxhighlight> | ||
+ | Travailler avec des pointeurs typés est plus rapide qu'avec des pointeurs non typés.<br/> | ||
+ | Cependant les pointeurs non typés sont plus flexibles car non liés à un type particulier.<br/> | ||
+ | ==Pointeur typé== | ||
+ | Exemple d'utilisation d'un pointeur typé sur un type de donnée simple : | ||
+ | <syntaxhighlight> | ||
+ | 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 à l'une des variables. | ||
+ | p := @a; // La p variable de type Pointer reçoit maintenant l'adresse de la variable a été attribuée. | ||
+ | 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 de référence dorénavant plus rien. | ||
+ | // Le pointeur p pourra désigner une nouvelle adresse de mémoire. | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | {{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 : | ||
+ | <syntaxhighlight> | ||
+ | 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 de l'enregistrement à travers le pointeur. | ||
+ | p^.Wert2 := 'TestTest'; // Affectation d'un champ de donnée de l'enregistrement à travers le pointeur. | ||
+ | p^.Wert3 := 'TestTestTest'; // Affectation d'un champ de donnée de l'enregistrement à travers le pointeur. | ||
+ | Dispose(p); // Libération de la mémoire allouée à l'enregsitrement | ||
+ | // Les valeurs des champs de données sont alors perdues. | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | ==Pointeur non typé== | ||
+ | Exemple de définition d'un pointeur non typé : | ||
+ | <syntaxhighlight> | ||
+ | var | ||
+ | ptr2: Pointer; | ||
+ | </syntaxhighlight> | ||
+ | Nouvelle allocation et libération de la mémoire :<br/> | ||
+ | <syntaxhighlight> | ||
+ | begin | ||
+ | ... | ||
+ | GetMem(ptr2,4); // Integer est de 32 Bit, donc 4 une taille de 4 octets | ||
+ | Integer(ptr2^) := 2048; // Affectation de la valeur | ||
+ | FreeMem(ptr2); // Libération de la mémoire | ||
+ | ... | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | ==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:<br/> | ||
+ | Exemple 1: | ||
+ | <syntaxhighlight> | ||
+ | var | ||
+ | ptr1: ^Integer; // créé un pointeur typé pour le type de donnée Integer | ||
+ | </syntaxhighlight> | ||
+ | Allocation et libération de mémoire : | ||
+ | <syntaxhighlight> | ||
+ | begin | ||
+ | ... | ||
+ | New(ptr1); // Les appels à un emplacement de mémoire où il peut 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; | ||
+ | </syntaxhighlight> | ||
+ | Exemple 2: | ||
+ | <syntaxhighlight> | ||
+ | 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 | ||
− | Pour comprendre la notion de pointeur | + | 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; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | =Liens externes= | ||
+ | Pour comprendre la notion de pointeur, vous pouvez lire cette excellente introduction aux [http://fbeaulieu.developpez.com/guide/9-pointeurs.html pointeurs (fr)] | ||
{{Data types/fr}} | {{Data types/fr}} |
Revision as of 16:17, 5 February 2017
│
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 un type de données entier pour stocker 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 à l'une des variables.
p := @a; // La p variable de type Pointer reçoit maintenant l'adresse de la variable a été attribuée.
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 de référence dorénavant plus rien.
// Le pointeur p pourra désigner une nouvelle adresse de mémoire.
end;
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 de l'enregistrement à travers le pointeur.
p^.Wert2 := 'TestTest'; // Affectation d'un champ de donnée de l'enregistrement à travers le pointeur.
p^.Wert3 := 'TestTestTest'; // Affectation d'un champ de donnée de l'enregistrement à travers le pointeur.
Dispose(p); // Libération de la mémoire allouée à l'enregsitrement
// 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 4 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); // Les appels à un emplacement de mémoire où il peut 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 |