Hallo Leute,
Was ist eigentlich der Vorteil einer Referenz gebenüber eines Zeigers ?
Gruß Gizno
Zeiger vs. Referenz
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Zeiger vs. Referenz
Hier wird das unter anderem ausführlich behandelt:
http://www.proggen.org/doku.php?id=cpp:ref:start
http://www.proggen.org/doku.php?id=cpp:ref:start
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
- fat-lobyte
- Beiträge: 1398
- Registriert: Sa Jul 05, 2008 12:23 pm
- Wohnort: ::1
- Kontaktdaten:
Re: Zeiger vs. Referenz
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 ^^).
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 ^^).
Haters gonna hate, potatoes gonna potate.
Re: Zeiger vs. Referenz
Referenztypen (aka Zeiger, C++-Referenzen, Java-Referenzen) kann man ganz gut an Hand von zwei Eigenschaften vergleichen*:
* Besitz wäre eine weitere Dimension. Etwa wie unique_ptr in C++11.
- Kann null sein oder nicht
- Das referenzierte Ding kann sich ändern
* Besitz wäre eine weitere Dimension. Etwa wie unique_ptr in C++11.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Zeiger vs. Referenz
Das lässt sich über eine Templateklasse abbilden, aber schön ist das trotzdem nicht.Panke hat geschrieben:Eine dritte Alternative, der Zeiger der nicht null sein kann, aber auf verschiedene Dinge zeigen kann, sieht man relativ selten.
Diese Art von Referenz vermisse ich jedenfalls auch.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.