Difference between revisions of "Pointer/fr"
m (Fixed syntax highlighting) |
|||
(One intermediate revision by one other user not shown) | |||
Line 6: | Line 6: | ||
Ce que sont les pointeurs : | Ce que sont les pointeurs : | ||
* Un pointeur est une référence à un emplacement mémoire. | * Un pointeur est une référence à un emplacement mémoire. | ||
− | * Un pointeur est | + | * 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. | * 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. | * La taille d'un pointeur dépend du processeur et du système d'exploitation, soit 4 ou 8 octets. | ||
Exemple:<br/> | Exemple:<br/> | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang=pascal> |
var | var | ||
ptr1: ^Integer; // typé | ptr1: ^Integer; // typé | ||
Line 19: | Line 19: | ||
==Pointeur typé== | ==Pointeur typé== | ||
Exemple d'utilisation d'un pointeur typé sur un type de donnée simple : | Exemple d'utilisation d'un pointeur typé sur un type de donnée simple : | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang=pascal> |
var | var | ||
− | a, b: Integer; // a et b sont des variable de type Integer. | + | 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. | + | p: ^Integer; // "p" est un pointeur, il peut accueillir l'adresse d'une variable du type Integer. |
begin | begin | ||
− | a := 500; // Affectation d'une valeur correcte à | + | a := 500; // Affectation d'une valeur correcte à la variable "a". |
− | p := @a; // La p | + | 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. | + | 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 | + | 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. | + | // Le pointeur "p" pourra désigner une nouvelle adresse de mémoire. |
end; | end; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{{Warning|Tout tentative d'accès à l'espace mémoire via un pointeur valant '''Nil''' provoque une erreur à l'exécution.}} | {{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 : | Exemple d'utilisation d'un pointeur typé sur un enrtegistrement : | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang=pascal> |
type | type | ||
TNewRecord = record | TNewRecord = record | ||
Line 44: | Line 44: | ||
begin | begin | ||
New(p); // Allocation de mémoire pour un variable de type TNewRecord. | New(p); // Allocation de mémoire pour un variable de type TNewRecord. | ||
− | p^.Wert1 := 'Test'; // Affectation d'un champ de donnée | + | 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 | + | 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 | + | 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 | + | Dispose(p); // Libération de la mémoire allouée au TNewRecord. |
// Les valeurs des champs de données sont alors perdues. | // Les valeurs des champs de données sont alors perdues. | ||
end; | end; | ||
Line 53: | Line 53: | ||
==Pointeur non typé== | ==Pointeur non typé== | ||
Exemple de définition d'un pointeur non typé : | Exemple de définition d'un pointeur non typé : | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang=pascal> |
var | var | ||
ptr2: Pointer; | ptr2: Pointer; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Nouvelle allocation et libération de la mémoire :<br/> | Nouvelle allocation et libération de la mémoire :<br/> | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang=pascal> |
begin | begin | ||
... | ... | ||
− | GetMem(ptr2,4); // Integer est de 32 Bit, donc | + | GetMem(ptr2,4); // Integer est de 32 Bit, donc une taille de 4 octets |
Integer(ptr2^) := 2048; // Affectation de la valeur | Integer(ptr2^) := 2048; // Affectation de la valeur | ||
FreeMem(ptr2); // Libération de la mémoire | FreeMem(ptr2); // Libération de la mémoire | ||
Line 95: | Line 95: | ||
Exemple de définitions de pointeurs typés:<br/> | Exemple de définitions de pointeurs typés:<br/> | ||
Exemple 1: | Exemple 1: | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang=pascal> |
var | var | ||
ptr1: ^Integer; // créé un pointeur typé pour le type de donnée Integer | ptr1: ^Integer; // créé un pointeur typé pour le type de donnée Integer | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Allocation et libération de mémoire : | Allocation et libération de mémoire : | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang=pascal> |
begin | begin | ||
... | ... | ||
− | New(ptr1); // | + | New(ptr1); // Réserve un emplacement de mémoire pour stocker sa valeur |
ptr1^ := 1; // Affecte la valeur à l'emplacement mémoire | ptr1^ := 1; // Affecte la valeur à l'emplacement mémoire | ||
Dispose(ptr1) // libère la mémoire pour un usage ultérieur | Dispose(ptr1) // libère la mémoire pour un usage ultérieur | ||
Line 111: | Line 111: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Exemple 2: | Exemple 2: | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang=pascal> |
function funTest: string; | function funTest: string; | ||
var | var |
Latest revision as of 08:19, 23 February 2020
│
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;
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 |