Seite 1 von 1

Zeiger vs. Referenz

Verfasst: Do Jul 12, 2012 3:29 pm
von gizno82
Hallo Leute,

Was ist eigentlich der Vorteil einer Referenz gebenüber eines Zeigers ?

Gruß Gizno

Re: Zeiger vs. Referenz

Verfasst: Do Jul 12, 2012 3:31 pm
von cloidnerux
Hier wird das unter anderem ausführlich behandelt:
http://www.proggen.org/doku.php?id=cpp:ref:start

Re: Zeiger vs. Referenz

Verfasst: Do Jul 12, 2012 3:54 pm
von fat-lobyte
Um zur Verwirrung beizutragen:

Beide Konzepte sind dazu da, um gewisse Objekte im Speicher anzusprechen.

Allerdings kannst du einen Zeiger auch nach der Funktion aufteilen:
* Du hast einerseits einen "Griff" (Handle) auf deine Daten, und zwar entweder auf EIN Objekt, oder auf eine Sammlung davon.
* anderseits hast du die Möglichkeit zur "Arithmetik", wenn du einen Zeiger auf eine Sammlung betrachtest - du kannst von Element zu Element springen oder die Stelle selbst berechnen

Diese beiden Zwecke eines Zeigers sind in C untrennbar vereint.
In C++ werden diese abstrahiert und getrennt:

Für den ersten Zweck gibt es Referenzen, mit denen du zwar Zugriff auf deine Daten hast, aber keine Berechnungen durchführen kannst.
Eine Referenz kannst du in C++ nur mit einem existierenden Objekt initialisieren, nicht aber ohne (außer du machst das Mutwillig). Diese sind viel sicherer als Zeiger.

In wirklichkeit verbirgt sich hinter jeder Referenz ein Zeiger, allerdings schränkt dich der Compiler so weit ein und Unterstützt dich, dass du dir damit (fast) nicht wehtun kannst - im Gegensatz zu Zeigern.

Für den Zweiten gibt es Iteratoren, mit denen du dich in Sammlungen von Elementen bewegen kannst und darauff Zugreifen kannst, diese Ähneln den C++-Zeigern, sind aber eine Abstraktion (gehört nicht so ganz zum Thema, sorry ^^).

Re: Zeiger vs. Referenz

Verfasst: Do Jul 12, 2012 4:53 pm
von Panke
Referenztypen (aka Zeiger, C++-Referenzen, Java-Referenzen) kann man ganz gut an Hand von zwei Eigenschaften vergleichen*:
  • Kann null sein oder nicht
  • Das referenzierte Ding kann sich ändern
Und hier ist eben: Zeiger können null sein und das referenzierte Ding kann sich ändern. Referenzen genau umgekehrt. Eine dritte Alternative, der Zeiger der nicht null sein kann, aber auf verschiedene Dinge zeigen kann, sieht man relativ selten. Das hält Tony Hoare (Erfinder von Quicksort und Algol(?) ) für seinen größten Fehler.

* Besitz wäre eine weitere Dimension. Etwa wie unique_ptr in C++11.

Re: Zeiger vs. Referenz

Verfasst: Do Jul 12, 2012 5:08 pm
von Xin
Panke hat geschrieben:Eine dritte Alternative, der Zeiger der nicht null sein kann, aber auf verschiedene Dinge zeigen kann, sieht man relativ selten.
Das lässt sich über eine Templateklasse abbilden, aber schön ist das trotzdem nicht.
Diese Art von Referenz vermisse ich jedenfalls auch.