Registriert: Sa Nov 02, 2002 18:06 Beiträge: 299 Wohnort: Dresden
Ich weiß ja woran's liegt und hab auch scon eine Idee. Zu deiner Frage:
@ - Adresse einer Variable im Speicher, Nutzug: Pointer := @Variable Pointer wird die Ardesse von Variable zugeordnet
^ nach einer Var, nur bei Pointern möglich, gibt den Wert zurück auf den der Pointer zeigt. Beispiel:
Variable := Pointer^, weißt Var. den Wert auf den Pointer zeigt zu, also Pointer^ gibt den Wert zurück, auf den Pointer zeigt, aber nur Pointer gibt den Inhalt von Pointer aus, also eine Adresse
^ vor: Definiert einen Pointer: type PInteger = ^Integer es wird ein Zeiger für Integer erstellt.
Verstanden? Wenn nicht Delphi Hilfe
_________________ "Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wenn man einmal die Logik hinter einem Pointer begriffen hat ist alles gar kein Problem. Und ein Tutorial kann man mit solche einem Thema wirklich nicht füllen.
Also das @ ist der Adressoperator. Damit bekommst du die Adresse eines Nicht Pointertyps. Also von einer Variable. Wie das verhalten bei einem Pointer ist kann ich dir nicht genau sagen. Aber das macht man ja auch nicht.
Das ^ dient dazu um einen Pointer zu dereferenzieren. Wenn du normalerweise einem Pointer etwas zuweist dann veränderst du die Adresse des Selbigen. Wenn du ihn dereferenziert hast dann greifst du auf deren Inhalt zu.
Code:
var
blub: PInt;
zahl:Integer;
begin
// Blub auf den Pointer von Zahl setzen
blub :=@Zahl;
// Zahl etwas zuweisen.
zahl :=20;
// Blub etwas zuweisen
blub^:=23;
end;
Nach der Zuweisung von blub^ := 23 beinhaltet auch Zahl 23. Mit new reservierst du Speicher für einen Pointertypen. Mit dispose löscht du ihn wieder. Wenn sich der Pointer mit einer Variablen den Speicher teilt musst du ihn natürlich nicht mit new erzeugen.
Ein Spezialfall ist ein Pointer auf ein Array. Da würde das in etwa so aussehen.
Code:
pIntArray^[0]:=13;
Warum das so aussieht ist auch klar. Du hast ein Pointer auf ein IntegerArray. Du musst also zu erst den Pointer des Arrays dereferenzieren und kannst dann auf die einzelnen Elemente zugreifen.
Ein Array mit IntegerPointern
Code:
pIntArray[0]^:=13;
Ein PointerArray mit IntegerPointern
Code:
pIntArray^[0]^:=13;
Das muss an Beispielen erst einmal reichen.
Du musst immer das dereferenzieren was ein Pointer ist.
Das Schwierigte ist aber immer darauf zu achten, dass kein Pointer verloren geht und immer alle ierzeugt wurden etc.
Das war im groben und ganzen alles das du über Pointer wissen muss um damit arbeiten zu können.
PS: Auf meiner Webseite habe ich eine Unit namens Hash.pas. Dahinter verbirgt sich eine Hashklasse die mit verketteten Listen (Pointer die auf andere Pointer zeigen) arbeitet. Zum Eingewöhnen ist das bestimmt eine passende Lektüre.
@HomerS: Wegen deinem Baum. Da kann ich dir konkret leider nicht helfen, da ich so etwas bisher auch noch nie gemacht hatte.
Also das @ ist der Adressoperator. Damit bekommst du die Adresse eines Nicht Pointertyps. Also von einer Variable. Wie das verhalten bei einem Pointer ist kann ich dir nicht genau sagen. Aber das macht man ja auch nicht.
Ein Zeiger ist (im 32 Bit Flat adressed Mode, in dem fast alle Win32 Programme laufen) nichts anderes, als ein 32 Bit Integer, der ebenso wie alle anderen Variablen, ebenfalls eine Adresse hat, die mittels @ oder Addr (ohne Typüberprüfung) abgefragt werden kann.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Richtig jetzt wo du es sagst klingt es irgendwie logisch. Aber was will man schon mit einem Pointer der wiederum nur auf die Adresse eine Pointers zeigt.
Man kann z.B. dynamische Listen geschickter implementieren:
(FirstEl ist ein Zeiger auf das erste Element der Liste)
Code:
type
PListEl = ^TListEl;
PPListEl = ^PListEl;
TListEl = record
data: integer;
next: PListEl;
end;
var Demo: PPListEl;
begin
Demo := @FirstEl^.next;
jetzt kann man mit Demo^^ den Inhalt des nächsten Elementes von FirstEl ändern und mit Demo^ die Adresse auf die FirstEl.next zeigt - ohne wissen zu müssen, wo sich FirstEl befindet (für diese Funktionalität müsste man ansonsten entweder einen Hilfszeiger mitlaufen lassen - oder aber ein "prev" Element auf das vorhergehende Listenelement definieren).
Besonder lesbar macht dies den Code aber - zugegebenermaßen - nicht. Immerhin ist es doch (manchmal) praktisch.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Klingt einleuchtend. Habe ich ehrlich gesagt aber noch nie gebraucht. Ich bin bisher auch immer ganz gut mit dem einen Pointer ausgekommen. Bzw. wollte ich dann nie den Zeiger von Next ändern. Aber wieder was gelernt.
Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.