Sign in Join
Wiki copytemporary

Pointer/fr: what changed

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

Title: Pointer/fr

OldNewLine
1+\
2+
3+# Généralités sur les pointeurs
4+
5+Ce que sont les pointeurs :
6+
7+- Un pointeur est une référence à un emplacement mémoire.
8+- Un pointeur est du type de données entier qui stocke une adresse de mémoire.
9+- Un pointeur désigne le premier octet d'une variable ou un objet.
10+- La taille d'un pointeur dépend du processeur et du système d'exploitation, soit 4 ou 8 octets.
11+
12+Exemple:\
13+
14+``` pascal
15+var
16+ ptr1: ^Integer; // typé
17+ ptr2: Pointer; // non typé
18+```
19+
20+Travailler avec des pointeurs typés est plus rapide qu'avec des pointeurs non typés.\
21+Cependant les pointeurs non typés sont plus flexibles car non liés à un type particulier.\
22+==Pointeur typé== Exemple d'utilisation d'un pointeur typé sur un type de donnée simple :
23+
24+``` pascal
25+var
26+ a, b: Integer; // "a" et "b" sont des variable de type Integer.
27+ p: ^Integer; // "p" est un pointeur, il peut accueillir l'adresse d'une variable du type Integer.
28+begin
29+ a := 500; // Affectation d'une valeur correcte à la variable "a".
30+ p := @a; // La variable "p" de type Pointer reçoit maintenant l'adresse qui a été attribuée à la variable "a".
31+ 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".
32+ p := nil; // La variable "p" ne référence dorénavant plus rien.
33+ // Le pointeur "p" pourra désigner une nouvelle adresse de mémoire.
34+end;
35+```
36+
37+> **Warning:** Tout tentative d'accès à l'espace mémoire via un pointeur valant **Nil** provoque une erreur à l'exécution.
38+
39+Exemple d'utilisation d'un pointeur typé sur un enrtegistrement :
40+
41+``` pascal
42+type
43+ TNewRecord = record
44+ Wert1: ShortString;
45+ Wert2: ShortString;
46+ Wert3: ShortString;
47+ end;
48+var
49+ p: ^TNewRecord;
50+begin
51+ New(p); // Allocation de mémoire pour un variable de type TNewRecord.
52+ p^.Wert1 := 'Test'; // Affectation d'un champ de donnée du TNewRecord par le pointeur.
53+ p^.Wert2 := 'TestTest'; // Affectation d'un champ de donnée du TNewRecord par le pointeur.
54+ p^.Wert3 := 'TestTestTest'; // Affectation d'un champ de donnée du TNewRecord par le pointeur.
55+ Dispose(p); // Libération de la mémoire allouée au TNewRecord.
56+ // Les valeurs des champs de données sont alors perdues.
57+end;
58+```
59+
60+## Pointeur non typé
61+
62+Exemple de définition d'un pointeur non typé :
63+
64+``` pascal
65+var
66+ ptr2: Pointer;
67+```
68+
69+Nouvelle allocation et libération de la mémoire :\
70+
71+``` pascal
72+begin
73+ ...
74+ GetMem(ptr2,4); // Integer est de 32 Bit, donc une taille de 4 octets
75+ Integer(ptr2^) := 2048; // Affectation de la valeur
76+ FreeMem(ptr2); // Libération de la mémoire
77+ ...
78+end;
79+```
80+
81+## Types de pointeurs typés prédéfinis
82+
83+Il existe, par exemple dans Free Pascal et autres, les pointeurs prédéfinis suivants.
84+
85+- Pour les type caractères :
86+ - PChar (Pointeur pour le type de donnée Char)
87+ - PAnsiChar (Pointeur pour le type de donnée AnsiChar)
88+ - PWideCahr (Pointeur pour le type de donnée WideChar)
89+ - PUnicodeChar (Pointeur pour le type de donnée UnicodeChar)
90+- Pour les types entiers non signés :
91+ - PByte (Pointeur pour le type de donnée Byte)
92+ - PWord (Pointeur pour le type de donnée Word)
93+ - PDWord (Pointeur pour le type de donnée DWord)
94+ - PCardinal (Pointeur pour le type de donnée Cardinal)
95+ - PLongword (Pointeur pour le type de donnée Longword)
96+- Pour les types entiers signés :
97+ - PShortint (Pointeur pour le type de donnée Shortint)
98+ - PSmallint (Pointeur pour le type de donnée Smallint)
99+ - PInteger (Pointeur pour le type de donnée Integer)
100+ - PLongint (Pointeur pour le type de donnée Longint)
101+ - PInt64 (Pointeur pour le type de donnée Int64)
102+- Pour les types réels flottants :
103+ - PSingle (Pointeur pour le type de donnée Single)
104+ - PDouble (Pointeur pour le type de donnée Double)
105+ - PExtended (Pointeur pour le type de donnée Extended)
106+ - PComp (Pointeur pour le type de donnée Comp)
107+ - PCurrency (Pointeur pour le type de donnée Currency)
108+
109+Exemple de définitions de pointeurs typés:\
110+Exemple 1:
111+
112+``` pascal
113+var
114+ ptr1: ^Integer; // créé un pointeur typé pour le type de donnée Integer
115+```
116+
117+Allocation et libération de mémoire :
118+
119+``` pascal
120+begin
121+ ...
122+ New(ptr1); // Réserve un emplacement de mémoire pour stocker sa valeur
123+ ptr1^ := 1; // Affecte la valeur à l'emplacement mémoire
124+ Dispose(ptr1) // libère la mémoire pour un usage ultérieur
125+ // ce qui veur dire que la valeur est perdue
126+ ...
127+end;
128+```
129+
130+Exemple 2:
131+
132+``` pascal
133+function funTest: string;
134+var
135+ ptrZeiger: PInteger; // Type prédéfini de pointeur sur Integer dans Free Pascal
136+ { on pourrait déclarer de manière équivalente : ptrZeiger: ^Integer }
137+ intZahl: Integer;
138+begin
139+
140+ result:= '';
141+ intZahl := 4; // une valeur pour la variable
142+
143+ ptrZeiger := @intZahl; // le pointeur désigne maintenant la variable IntZahl
144+ result := Inttostr(ptrZeiger^); // Retourne la valeur désignée par ptrZeiger soit aussi celle de intZahl.
145+
146+end;
147+```
148+
149+# Liens externes
150+
151+Pour comprendre la notion de pointeur, vous pouvez lire cette excellente introduction aux [pointeurs (fr)](http://fbeaulieu.developpez.com/guide/9-pointeurs.html)
152+
153+---
154+*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