Sign in Join
Wiki copytemporary

Pointer/fr: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-\
2-
31# Généralités sur les pointeurs
42
53Ce que sont les pointeurs :
64
75- Un pointeur est une référence à un emplacement mémoire.
86- Un pointeur est du type de données entier qui stocke une adresse de mémoire.
97- Un pointeur désigne le premier octet d'une variable ou un objet.
108- La taille d'un pointeur dépend du processeur et du système d'exploitation, soit 4 ou 8 octets.
119
1210Exemple:\
1311
1412``` pascal
1513var
1614 ptr1: ^Integer; // typé
1715 ptr2: Pointer; // non typé
1816```
1917
2018Travailler avec des pointeurs typés est plus rapide qu'avec des pointeurs non typés.\
2119Cependant les pointeurs non typés sont plus flexibles car non liés à un type particulier.\
2220==Pointeur typé== Exemple d'utilisation d'un pointeur typé sur un type de donnée simple :
2321
2422``` pascal
2523var
2624 a, b: Integer; // "a" et "b" sont des variable de type Integer.
2725 p: ^Integer; // "p" est un pointeur, il peut accueillir l'adresse d'une variable du type Integer.
2826begin
2927 a := 500; // Affectation d'une valeur correcte à la variable "a".
3028 p := @a; // La variable "p" de type Pointer reçoit maintenant l'adresse qui a été attribuée à la variable "a".
3129 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".
3230 p := nil; // La variable "p" ne référence dorénavant plus rien.
3331 // Le pointeur "p" pourra désigner une nouvelle adresse de mémoire.
3432end;
3533```
3634
3735> **Warning:** Tout tentative d'accès à l'espace mémoire via un pointeur valant **Nil** provoque une erreur à l'exécution.
3836
3937Exemple d'utilisation d'un pointeur typé sur un enrtegistrement :
4038
4139``` pascal
4240type
4341 TNewRecord = record
4442 Wert1: ShortString;
4543 Wert2: ShortString;
4644 Wert3: ShortString;
4745 end;
4846var
4947 p: ^TNewRecord;
5048begin
5149 New(p); // Allocation de mémoire pour un variable de type TNewRecord.
5250 p^.Wert1 := 'Test'; // Affectation d'un champ de donnée du TNewRecord par le pointeur.
5351 p^.Wert2 := 'TestTest'; // Affectation d'un champ de donnée du TNewRecord par le pointeur.
5452 p^.Wert3 := 'TestTestTest'; // Affectation d'un champ de donnée du TNewRecord par le pointeur.
5553 Dispose(p); // Libération de la mémoire allouée au TNewRecord.
5654 // Les valeurs des champs de données sont alors perdues.
5755end;
5856```
5957
6058## Pointeur non typé
6159
6260Exemple de définition d'un pointeur non typé :
6361
6462``` pascal
6563var
6664 ptr2: Pointer;
6765```
6866
6967Nouvelle allocation et libération de la mémoire :\
7068
7169``` pascal
7270begin
7371 ...
7472 GetMem(ptr2,4); // Integer est de 32 Bit, donc une taille de 4 octets
7573 Integer(ptr2^) := 2048; // Affectation de la valeur
7674 FreeMem(ptr2); // Libération de la mémoire
7775 ...
7876end;
7977```
8078
8179## Types de pointeurs typés prédéfinis
8280
8381Il existe, par exemple dans Free Pascal et autres, les pointeurs prédéfinis suivants.
8482
8583- Pour les type caractères :
8684 - PChar (Pointeur pour le type de donnée Char)
8785 - PAnsiChar (Pointeur pour le type de donnée AnsiChar)
8886 - PWideCahr (Pointeur pour le type de donnée WideChar)
8987 - PUnicodeChar (Pointeur pour le type de donnée UnicodeChar)
9088- Pour les types entiers non signés :
9189 - PByte (Pointeur pour le type de donnée Byte)
9290 - PWord (Pointeur pour le type de donnée Word)
9391 - PDWord (Pointeur pour le type de donnée DWord)
9492 - PCardinal (Pointeur pour le type de donnée Cardinal)
9593 - PLongword (Pointeur pour le type de donnée Longword)
9694- Pour les types entiers signés :
9795 - PShortint (Pointeur pour le type de donnée Shortint)
9896 - PSmallint (Pointeur pour le type de donnée Smallint)
9997 - PInteger (Pointeur pour le type de donnée Integer)
10098 - PLongint (Pointeur pour le type de donnée Longint)
10199 - PInt64 (Pointeur pour le type de donnée Int64)
102100- Pour les types réels flottants :
103101 - PSingle (Pointeur pour le type de donnée Single)
104102 - PDouble (Pointeur pour le type de donnée Double)
105103 - PExtended (Pointeur pour le type de donnée Extended)
106104 - PComp (Pointeur pour le type de donnée Comp)
107105 - PCurrency (Pointeur pour le type de donnée Currency)
108106
109107Exemple de définitions de pointeurs typés:\
110108Exemple 1:
111109
112110``` pascal
113111var
114112 ptr1: ^Integer; // créé un pointeur typé pour le type de donnée Integer
115113```
116114
117115Allocation et libération de mémoire :
118116
119117``` pascal
120118begin
121119 ...
122120 New(ptr1); // Réserve un emplacement de mémoire pour stocker sa valeur
123121 ptr1^ := 1; // Affecte la valeur à l'emplacement mémoire
124122 Dispose(ptr1) // libère la mémoire pour un usage ultérieur
125123 // ce qui veur dire que la valeur est perdue
126124 ...
127125end;
128126```
129127
130128Exemple 2:
131129
132130``` pascal
133131function funTest: string;
134132var
135133 ptrZeiger: PInteger; // Type prédéfini de pointeur sur Integer dans Free Pascal
136134 { on pourrait déclarer de manière équivalente : ptrZeiger: ^Integer }
137135 intZahl: Integer;
138136begin
139137
140138 result:= '';
141139 intZahl := 4; // une valeur pour la variable
142140
143141 ptrZeiger := @intZahl; // le pointeur désigne maintenant la variable IntZahl
144142 result := Inttostr(ptrZeiger^); // Retourne la valeur désignée par ptrZeiger soit aussi celle de intZahl.
145143
146144end;
147145```
148146
149147# Liens externes
150148
151149Pour comprendre la notion de pointeur, vous pouvez lire cette excellente introduction aux [pointeurs (fr)](http://fbeaulieu.developpez.com/guide/9-pointeurs.html)
152150
153151---
154152*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](/wiki-contact).*

Back to history