Pointer/de
│
Deutsch (de) │
English (en) │
suomi (fi) │
français (fr) │
русский (ru) │
Zurück zu den Datentypen.
Allgemeines zu Pointern / Zeigern
Eigenschaften eines Pointers (Zeigers):
- Ein Pointer ist ein Zeiger (eine Referenz) auf eine Speicherstelle.
- Ein Pointer ist ein ganzzahliger Datentyp zum Speichern einer Arbeitsspeicheradresse.
- Ein Pointer verweist auf die Anfangsadresse einer Variablen oder eines Objektes.
- Die Größe des Pointers ist entweder Longint oder Int64.
- Die genaue Größe des Pointers (Zeigers) ist abhängig vom Zielbetriebssystem und dem Zielprozessor.
Beispiel:
var
ptr1: ^Integer; // typisiert
ptr2: Pointer; // untypisiert
Das Arbeiten mit typisierten Pointern ist schneller als das Arbeiten mit untypisierten Pointern.
Dafür bietet das Arbeiten mit untypisierten Pointern mehr Flexibilität, da diese nicht an einen Datentyp gebunden sind.
Beispiel für die Verwendung eines typisierten Pointers an einem einfachen Datentyp:
var
a, b: Integer; // a und b sind Integer-Variablen.
p: ^Integer; // p ist ein Pointer, der die Speicheradresse einer Variablen vom Datentyp Integer aufnehmen kann.
begin
a := 500; // Die Variable a vom Datentyp Integer erhält einen gültigen Wert zugewiesen.
p := @a; // Die Variable p vom Datentyp Pointer erhält jetzt die Adresse der Variablen a zugewiesen.
b := p^; // Die Variable b vom Datentyp Integer holt sich über die Adresse im Pointer p den Wert aus der Variablen a.
p := nil; // Die Variable p vom Datentyp Pointer enthält jetzt keine Adresse mehr (die Variable p zeigt auf nichts).
// Der Pointer p kann mit einer neuen Speicheradresse versehen werden.
end;
Beispiel für die Verwendung eines typisierten Pointers an einem Record:
type
TNewRecord = record
Wert1: ShortString;
Wert2: ShortString;
Wert3: ShortString;
end;
var
p: ^TNewRecord;
begin
New(p); // erstellt einen Pointer und ein Object vom Typ TNewRecord.
p^.Wert1 := 'Test'; // befüllt über den Pointer das Datenfeld des Objektes.
p^.Wert2 := 'TestTest'; // befüllt über den Pointer das Datenfeld des Objektes.
p^.Wert3 := 'TestTestTest'; // befüllt über den Pointer das Datenfeld des Objektes.
Dispose(p); // Gibt den Pointer und damit das Objekt frei.
// Damit sind alle Datenfelder und Daten des Pointers p gelöscht.
end;
Untypisierte Pointer / Zeiger
Beispiel für die Definition eines untypisierten Pointers:
var
ptr2: Pointer;
Neuen Speicher anfordern und freigeben:
begin
...
GetMem(ptr2, 4); // Integer ist 32 Bit, also 4 Byte groß
Integer(ptr2^) := 2048; // Wert zuweisen
FreeMem(ptr2); // Speicher freigeben
...
end;
Typisierte Pointer / Zeiger
Es gibt zum Beispiel in Free Pascal u. a. folgende vordefinierte Pointer (Zeiger):
- Pointer für Zeichentypen:
- PChar (Zeiger für den Datentyp Char)
- PAnsiChar (Zeiger für den Datentyp AnsiChar)
- PWideCahr (Zeiger für den Datentyp WideChar)
- PUnicodeChar (Zeiger für den Datentyp UnicodeChar)
- Pointer für vorzeichenlose ganzzahllige Werte:
- PByte (Zeiger für den Datentyp Byte)
- PWord (Zeiger für den Datentyp Word)
- PDWord (Zeiger für den Datentyp DWord)
- PCardinal (Zeiger für den Datentyp Cardinal)
- PLongword (Zeiger für den Datentyp Longword)
- Pointer für vorzeichenbehaftete ganzzahllige Werte:
- PShortint (Zeiger für den Datentyp Shortint)
- PSmallint (Zeiger für den Datentyp Smallint)
- PInteger (Zeiger für den Datentyp Integer)
- PLongint (Zeiger für den Datentyp Longint)
- PInt64 (Zeiger für den Datentyp Int64)
- Pointer für Fliesskommadatentypen Werte:
- PSingle (Zeiger für den Datentyp Single)
- PDouble (Zeiger für den Datentyp Double)
- PExtended (Zeiger für den Datentyp Extended)
- PComp (Zeiger für den Datentyp Comp)
- PCurrency (Zeiger für den Datentyp Currency)
Beispiele für die Definition eines typisierten Pointers:
Beispiel 1:
var
ptr1: ^Integer; // erstellt einen typisierten Zeiger für den Datentyp Integer
Neuen Speicher anfordern und freigeben:
begin
...
New(ptr1); // fordert für den Zeiger einen Speicher an, in dem er seinen Wert speichern kann
ptr1^ := 1; // Weist dem angeforderten Speicher einen Wert zu
Dispose(ptr1) // gibt den angeforderten Speicher mit dem darin vorhanden Wert frei
// das heisst der Wert wird gelöscht
...
end;
Beispiel 2:
function funTest: string;
var
ptrZeiger: PInteger; // von Free Pascal vordefinierter Zeiger für den Datentyp Integer
{
alternativ geht für
die Schreibweise ptrZeiger: PInteger;
die Schreibweise ptrZeiger: ^integer;
}
intZahl: Integer; // definiert den Speicherort (Variable) für einen Integer Wert
begin
result:= '';
intZahl := 4; // Weist der Variablen einen Wert zu
ptrZeiger := @intZahl; // Weist dem Zeiger die Adresse der Variablen zu
result := Inttostr(ptrZeiger^); // Der Zeiger übergibt den Wert der Variablen der Funktion
end;
Datentypen | |
---|---|
Einfacher Datentyp | Boolean | Byte |Cardinal | Char | Currency | Extended | Int64 | Integer | Longint | Pointer | Real | Shortint | Smallint | Word |
Zusammengesetzter Datentyp | Array | Class | Record | Set | String | ShortString |