Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zeiger oder nicht?


Niels_ - Fr 19.03.04 14:32
Titel: Zeiger oder nicht?
Ich verstehe nicht ganz den Sinn und Zweck eines Zeigers? Bei jedem Gebrauch eines Zeigers könnte ich doch eigentlich auch eine (Index-)Variable benutzen oder ähnliches - dieses ist doch viel einfacher zu verwenden...
Genauso unverständlich finde ich den Gebrauch des Zeigers wenn er auf sich selbst zeigt (Knoten.Nachfolger, wobei man Gebrauch von einem record macht) o.ä. Da is es doch viel einfacher und komfortabler ein dynamisches array zu benutzen, wo ich beliebig hin und her springen kann?!
Wo also liegt der Vorteil bei der Benutzung von Zeigern?? Bisher sehe ich da nur Nachteile...

Moderiert von user profile iconMotzi: Topic Verschoben


maximus - Fr 19.03.04 15:32
Titel: Re: Zeiger oder nicht?
Niels_ hat folgendes geschrieben:
Ich verstehe nicht ganz den Sinn und Zweck eines Zeigers? Bei jedem Gebrauch eines Zeigers könnte ich doch eigentlich auch eine (Index-)Variable benutzen oder ähnliches - dieses ist doch viel einfacher zu verwenden...

Zeiger haben durchaus ihre berechtigung, bzw. ohne sie würde nix gehn! zB. jede object referenz ist automatisch ein zeiger, du merkst es nur nicht, da sie sich so anfühlen, wie das object selbst. Nur wenn sie nil sind wird es so manchen schmerzlich bewusst. Zeiger sind halt die perfekten referenzen und avon braucht man in der egel jede menge :wink:
Zitat:

Genauso unverständlich finde ich den Gebrauch des Zeigers wenn er auf sich selbst zeigt (Knoten.Nachfolger, wobei man Gebrauch von einem record macht) o.ä. Da is es doch viel einfacher und komfortabler ein dynamisches array zu benutzen, wo ich beliebig hin und her springen kann?!

Ein array ist vielleicht praktischer für addressierung, aber nicht unbegingt schneller. Wenn man sowieso durch die gesammte liste iteriert dann hat ein linked list einen grossen vorteil: Die adresse eines elementes muss nicht extra ausgerechnet werden, da sie ganz einfach im 'next' pointer steht.

und hast du mal versucht in die mitte eines array ein element einzufügen? Das geht nämlich nicht ohne grosse kopier-vorgänge. Das ist bei einer linked list kein thema. Einfach ein paar zeiger-setzen fertig!

Zitat:

Wo also liegt der Vorteil bei der Benutzung von Zeigern?? Bisher sehe ich da nur Nachteile...

Was heist vorteile? ...ohne sie geht es nicht!

mfg.
maxiMe


Niels_ - Fr 19.03.04 16:35

Danke erstmal für die Antwort!

Okay, Zeiger sind also (fast) überall und sind schnell zu bearbeiten, aber wo ist dann genau der Unterschied zwischen Zeigern und Variablen? Ich habe damit so meine Schwierigkeiten...


Motzi - Fr 19.03.04 16:39

Schau mal auf http://www.manuel-poeter.de vorbei und wirf da mal einen Blick in mein Pointer-Tutorial.. vielleicht hilft dir das ein bisschen.. :)


Delete - Fr 19.03.04 17:54

Kurz zusammenfassend kann man sagen: Variablen beinhalten der Wert der an einer Speicheradresse steht, Zeiger beinhalten den Wert der Speicheradresse selber.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  p: Pointer;
begin
  i := 5;  // i hat den Wert 5.
  ShowMessage(IntToStr(i));
  p := @i;  // SpeicherAdresse von der Variablen i mit dem Wert 5.
  ShowMessage(IntToStr(Integer(p)));
end;


maximus - Fr 19.03.04 18:06

Niels_ hat folgendes geschrieben:
... aber wo ist dann genau der Unterschied zwischen Zeigern und Variablen?


Zeiger sind durchaus auch variablen. Um an den eigentlichen wert zukommen muss man halt dereferenzieren.

Und noch ein anwendungsgebiet sind prozedurale pointer. Das sind im prinzip sprungaddressen, die du so aufrufen kannst, wie normale procedure, nur mit dem unterschied, dass sich das ziel dynamisch zuweisen lässt -> bestes beispiel dafür sind die schönen delphi-events (OnClick etc.) :wink:


Motzi - Fr 19.03.04 18:12

maximus hat folgendes geschrieben:
bestes beispiel dafür sind die schönen delphi-events (OnClick etc.) :wink:

Da muss man dann nur aufpassen, dass ein Methodenzeiger (nichts andres sind die Delphi-Events) eigentlich Records sind die aus 2 Pointern bestehen..! Einmal die Adresse der Methode und einmal die Adresse des Objekts (für den Self-Pointer)!


maximus - Fr 19.03.04 19:02

Ich glaub so genau wollte Niels das garnicht wissen...aber klar sollte man das wissen, wenn man damit arbeitet :D