Zeiger und Referenz - äquivalent?
-
Slin schrieb:
So wäre es schön, aber leider Zeigen auch Referenzen nicht immer auf gültige Objekte!
Mag schon sein, nur hast du dann halt auch kein gültiges Programm mehr. Was du in deinen Beispielen machst, ist erstens eine Nullreferenz erzeugen. Der Standard schreibt aber vor, dass das Benutzen von "Nullreferenzen" kein gültiges C++ ist. Und zweitens, mit
delete a;
machst du den Zeiger ungültig, womit wir wieder beim Thema wären, dass Zeiger nicht immer auf ein gültiges Objekt zeigen müssen.
Zeig mir mal ein Beispiel (ohne Zeiger), wo du eine Referenz auf ein ungültiges Objekt verweisen lässt. Natürlich nur in gültigem C++, also solche Geschichten, wie zB eine Referenz auf eine lokale Variable aus einer Funktion zurückzugeben, sind auch tabu.Slin schrieb:
Belassen wir es dabei, dass sich constante Pointer und Referenzen sehr sehr ähnlich sind
Ähnlich heisst aber noch lange nicht äquivalent. Und warum bringst du immer wieder konstante Zeiger? Ich weiss nicht, ob der Threadersteller wirklich konstante Zeiger gemeint hat oder einfach nur generell Zeiger.
-
groovemaster schrieb:
Slin schrieb:
Belassen wir es dabei, dass sich constante Pointer und Referenzen sehr sehr ähnlich sind
Ähnlich heisst aber noch lange nicht äquivalent. Und warum bringst du immer wieder konstante Zeiger? Ich weiss nicht, ob der Threadersteller wirklich konstante Zeiger gemeint hat oder einfach nur generell Zeiger.
Konstante Zeiger, weil sie so wie Referenzen nur einmal zugewiesen werden können. Mit konstanten Zeigern kann man (fast) genau das Gleiche machen, wie mit Referenzen.
ein Unterschied ist z.B.:
int& foo = *(new int); ((int*)&foo) = NULL; // ungültig delete &foo; int * const bar = new int; ((int*)bar) = NULL; // gültig delete bar;
Man kann das const bei const pointern wegcasten, bei Referenzen hingegen nicht!
MfG
DDR-RAM
-
DDR-RAM schrieb:
Konstante Zeiger
Da ich kein Hellseher bin, wirst du mir es hoffentlich nicht übel nehmen, wenn ich die Aussage erstmal vollkommen ignoriere. Und da der Threadersteller in seinem Beispielcode keine konstanten Zeiger benutzt, bestärkt mich das noch mehr, dass er nicht speziell von konstanten Zeigern gesprochen hat.
DDR-RAM schrieb:
int& foo = *(new int); ((int*)&foo) = NULL; // ungültig delete &foo;
Dir wird es vielleicht entgangen sein, aber der Code ist nicht deshalb ungültig, weil eine Referenz im Spiel ist, sondern weil du schlichtweg keinen l-value hast. Und warum verwendest du einen Cast? &foo ist doch bereits vom Typ int*.
-
groovemaster schrieb:
Zeig mir mal ein Beispiel (ohne Zeiger), wo du eine Referenz auf ein ungültiges Objekt verweisen lässt. Natürlich nur in gültigem C++, also solche Geschichten, wie zB eine Referenz auf eine lokale Variable aus einer Funktion zurückzugeben, sind auch tabu.
Wird es nicht geben, da hast du absolut recht, da muss man gegen den Standard verstoßen, in sofern bin ich jetzt entgültig überzeugt, dass sie nicht äquivalent sind. Aber wer in diesem Forum nutzt schon den Standard *ugly*
groovemaster schrieb:
Und warum bringst du immer wieder konstante Zeiger? Ich weiss nicht, ob der Threadersteller wirklich konstante Zeiger gemeint hat oder einfach nur generell Zeiger.
Er meinte wohl generell Zeiger, aber wenn ich mich nciht täusche, war darauf auch schnell eine Antwort gefunden!
-
groovemaster schrieb:
Da ich kein Hellseher bin, wirst du mir es hoffentlich nicht übel nehmen, wenn ich die Aussage erstmal vollkommen ignoriere. Und da der Threadersteller in seinem Beispielcode keine konstanten Zeiger benutzt, bestärkt mich das noch mehr, dass er nicht speziell von konstanten Zeigern gesprochen hat.
Ich rede von const Zeigern, da const Zeigern den Referenzen näher sind als normale Zeiger. Aus der Frage des Threaderstellers entwickelte sich eine Diskusion, also muss man sich nicht nur auf den Threadersteller beziehen.
DDR-RAM schrieb:
int& foo = *(new int); ((int*)&foo) = NULL; // ungültig delete &foo;
Dir wird es vielleicht entgangen sein, aber der Code ist nicht deshalb ungültig, weil eine Referenz im Spiel ist, sondern weil du schlichtweg keinen l-value hast. Und warum verwendest du einen Cast? &foo ist doch bereits vom Typ int*.
Ich weiß schon was ich da gemacht habe und warum das ungültig ist.
Es ging nur um einen Vergleich, const pointer mit Referenz, der einen Unterschied darlegen sollte. (address of referenz != value of const pointer,
das eine ist ein R-Wert, wie du schon sagtest, das andere ein L-Wert, der konstant ist)
Aber, da du sowieso streng dagegen bist Ähnlichkeiten zu sehen, brauch ich meine Erläutungen nicht weiter fortführen.Fazit:
Referenzen sind keine Pointer.
Referenzen haben gewisse Ähnlichkeiten mit Pointern.
Referenzen sind const Pointern noch ähnlicher, aber noch lange nicht äquivalent.Nichts neues also.
MfG
DDR-RAM
-
DDR-RAM schrieb:
address of referenz
Was soll das sein? Meinst du das hier?
[cpp]((int*)&foo) = NULL;[/cpp]
Wie hier bereits erwähnt wurde, ist eine Referenz ein Alias. Du holst dir hier also nicht die Adresse der Referenz, sondern des referenzierten Objektes. Praktisch gesehen hast du folgendes((int*)&*(new int)) = NULL;
DDR-RAM schrieb:
Aber, da du sowieso streng dagegen bist Ähnlichkeiten zu sehen
Ich habe nie gesagt, dass es keine Ähnlichkeiten gibt, nur sind sie halt auch nicht äquivalent.