Referenzen vs. Zeiger
-
Ein Zeiger ist eine richtige Variable mit eigener Adresse, die die Adresse einer anderen Variable enthaelt. Was aber ist eine Referenz genau? Wo findet man diese Referenz im Speicher?
-
intern ist eine Referenz auch nix anderes als ein Zeiger, praktisch ein
- konstanter
- automatisch dereferenzierter
Zeiger
-
Eine Referenz steht als Synonym für die Originalvariable. Beispiel:
void quadrat(int &x) { x=x*x; }
quadrat kann nur mit einer Variablen und nicht mit einer Konstanten aufgerufen werden, da es sich bei x nicht um eine Kopie handelt sondern um den Originalwert.
Ansonsten gibt es noch den Adressoperator &, dieser liefert die adresse einer Variablen zurück.
Code-Hacker
-
Interessant dazu ist vielleicht noch das hier:
http://vaasa.wi-bw.tfh-wildau.de/~hendrix/grundstudium/cpp/skript/referenzen.html#Vergleich
-
Wenn beides technisch möglich ist nehme ich stets Referenzen.
-
Thx, aber wie wird eine Referenz intern verwaltet? Einen Zeiger kann man im Speicher selbst finden. Wie finde ich eine Referenz physisch?
-
Eine Referenz ist Sperrgebiet. d.h. du kannst nicht auf sie referenzieren, es gibt keine
int & &a //gibt es nicht
es ist sinnlos, die adresse einer referenz haben zu wollen, außerdem muss ja versichert sein, dass eine referenz immer auf denselben ort zeigt.
im normalfall, wenn der adressoperator & einer klasse überladen ist, nimm boost::addressof, der wahrscheinlich so ähnlich funktioniert wietemplate <class T> T *addressof (T &t) { return reinterpret_cast<T*>(&reinterpret_cast<char&>(t)); }
da sieht man schön das problem. die referenz ist erst in der parameterliste der funktion enthalten, ich gebe aber einen zeiger auf T zurück, nicht auf T& (was es ebenfalls nicht gibt)
referenzen sind stark beschnitten.
-
Man sollte vielleicht der Vollständigkeit halber noch ergänzen, dass T&* nicht geht aber T*& schon (ob es nun Sinn macht oder nicht)
.
-
Warum denn nicht?
-
In der praxis eher Refs nehmen, da sie fehlerunanfälliger sind. Ist aber
nicht immer möglich (zB wenn man mit NULL-Zeigern arbeiten will).
-
@Mastah: T*& macht schon Sinn - z.B.
void Realloc<T>(T *& ptr, int & size)Für die verwendung Zeiger/Referenz mach ich eher semantische Unterschiede - Ich sehe nix, wo eine Referenz wirklich ungefährlicher ist als ein Zeiger.
Funktionsparameter:
void Foo(CHamlet & x)
hier ist der Aufrufer verantwortlich, eine gültige Referenz zu übergeben (also keinen dereferenzierten Null-Zeiger)
void Foo(CHamlet * x)
hier sollte die Funktion abtesten, ob der übergebene zeiger NULL ist
-
Thx, aber wie wird eine Referenz intern verwaltet? Einen Zeiger kann man im Speicher selbst finden. Wie finde ich eine Referenz physisch?
Man findet sie schon im Speicher, es gibt nur keinen C++-Syntax, um die Adresse zu bekommen
-
Man findet sie schon im Speicher, es gibt nur keinen C++-Syntax, um die Adresse zu bekommen.
Wozu auch? Sie sind schließlich konstant. int &x = *f; return &x; gibt f zurück.
-
Bashar schrieb:
Warum denn nicht?
Hab wieder mal zu kurz gedacht
. Und gerade heute ist mir auf der Arbeit aufgefallen wie oft ich das doch verwende.
-
Danke fuer die Infos. Gibt es dennoch einen Weg, an Referenzen ran zu kommen?
-
Wie meinst du "rankommen"? Meinst du die Speicheradresse einer Referenz oder was?
-
.. schrieb:
Danke fuer die Infos. Gibt es dennoch einen Weg, an Referenzen ran zu kommen?
was hast du vor?
-
geht nicht. gründe sind ersichtlich.
-
wieoft soll man eigentlich noch nein sagen ????
-
so direkt hat es bis vor zwei postings eben noch niemand gesagt