Zeiger/Pointer?

Hallo liebe Leser ,

mich beschäftigt(wie hoffentlich aus der Überschrift hervorgeht)die Frage was Zeiger oder Pointer genau sind.Ich bin gerade dabei Delphi zu lernen und nun traf ich auf Zeiger.
Aus den vielen Büchern über Delphi in der Bücherei oder Buchhandlung werde ich nicht schlau und die Delphi-Hilfe eröffnet mir mehr fragen als ich zur Zeit benötige :wink:.

Ich stell mir das eigentlich nicht so schwer vor…
Es wird doch im Prinzip nur auf eine Stelle im Speicher „gezeigt“,aber wozu das ganze und wie vor allem?
Aus einem Buch den Quellcode abschreiben ist langweilig.

Könnte mir das einer der Experten irgendwie erklären…ganz banal :smiley:

Für jede Antwort und Hilfe bin ich dankbar

Gruß, Nasrudin

Hallo,

Ich stell mir das eigentlich nicht so schwer vor…
Es wird doch im Prinzip nur auf eine Stelle im Speicher
„gezeigt“,aber wozu das ganze und wie vor allem?

genau so ist es. Und an dieser Stelle befindet sich etwas. Z.B. eine Variable, ein Record o.ä.

Den Zeiger kann man zu verschiedenen Dingen brauchen. Wenn du zB größere Records sortieren willst (also zB Records, die Adressen enthalten) so musst du normalerweise beim Sortieren häufig den Inhalt zweier Records miteinander vertauschen und brauchst dazu noch einen Hilfsrecord, der voübergehend den Inhalt des einen aufnimmt zB (vertauschen von rec[1] und rec[7])

temp.Name := rec[1].Name;
rec[1].Name := rec[7].Name;
rec[7].Name := temp.Name;

und das musst du dann noch für rec[].Strasse, rec[].HausNr etc. machen. Und das ganze ein paar hundert mal beim Sortieren.

wenn du statt dessen mit Pointern arbeitest, brauchst du nur die Pointer miteinander zu tauschen. Dh statt große Speicherbereiche hin- und her zu schaufeln eben nur ein paar Pointer. Das gibt ordentlich Performancegewinn.

Du kannst an Funktionen Pointer übergeben und die Funktion kann dann das Objekt, auf das der Pointer weist behandeln (Delphi macht das automatisch wenn du einen Parameter der Funktion als „var“ kennzeichnest). Das ist dann nötig, wenn du zB C-Bibliotheken einbindest.

Es gibt typisierte und untypisierte Pointer. Der erste kann nur auf bestimmte Typen von Variablen oder Objekte verweisen, der zweite auf beliebige.
typisiert:

var
pTypisiert = ^MeinRecordTyp; //kann nur auf den Typ "MeinRecordTyp weisen
pUntypisiert = Pointer;

Mit dem ersten verhinderst du, das irgendetwas durcheinandergebracht wird, was nicht passt.

Wenn du einem Pointer die Adresse einer Variable oder eines Objekts zuweisen willst geht das so:

MeinPointer := @MeinVariable;

(@ = „Adresse von“ bzw „Speicherposition von“) Damit verweist der Pointer „MeinPointer“ auf die Variable „MeinVariable“.

Aus einem Buch den Quellcode abschreiben ist langweilig.

Es ist aber nützlich, diese Codes sich mal anzuschauen und sich zu fragen, was der Gewinn bei der Benutzung der Pointer ist.

Gruss, Niels

Ja, Zeiger sind Variablen, die eine Speicheraddresse enthalten. Nicht mehr. Interessant aber, was man damit machen kann:

Nils hat ja schon angesprochen dass Pointer

  • einen flexiblen (untypisierten) Zugriff auf Daten ermöglichen
  • Datenreihen verwalten können, ohne die Daten selbst im Speicher verschieben zu müssen

Hinzu kommt:

Mit Zeigern kann man VERKETTETE Listen erstellen. Dazu erstellt man einen zusammengesetzten Datentyp (Record), der neben den eigentlichen Datenfeldern noch einen (oder mehrere) Zeiger enthält. Diese® Zeiger zeigt auf andere Records. Damit lassen sich z.B. über die Zeiger verkettete Listen erstellen, wobei die Größe der Liste dynamisch zugewiesen werden kann. Wie Nils schon gesagt hat, lassen sich solche Listen schneller sortieren wie zB Arrays.

Enthält ein Record mehrere Zeiger, entstehen VERZWEIGTE Listen oder BAUMSTRUKTUREN. Sie sind das ideale Werkzeug für eine hierarchisch geordnete representation von Daten im Speicher. Sie erlauben sehr effiziente Sortier- und Suchalgorithmen.

Gruß, Jochen