Kleine Verständnisfrage zu Pointern. [SOLVED]
-
Also grundlegend habe ich Pointer ja verstanden aber nun bin ich des öffteren schon über folgend geartete Funktionsaufrufe gestolpert ...
beispielfunktion(int& a) { // code }
Nun die Frage die ich durch suche im Netz nicht wirklich klären konnte, was mache ich bei dieser Art von Aufrufen ? Übergebe ich da einen Zeiger oder einen Wert ?
Danke schonmal im Voraus.
-
Videonauth schrieb:
Also grundlegend habe ich Pointer ja verstanden
Das glaub ich dir nicht. Das sind Referenzen. Wichtiger Bestandteil von C++. Musst dir genauer anschauen.
-
Du uebergibst eine Referenz. Dazu findest du sicherlich ausfuehrliche Erklaerungen im Internet.
-
Naja in den meisten Tuts usw. und slebst Büchern wird das Pass by Reference eher so beschrieben ...
funktion(int* ptr) { *ptr = 2; } int main() { int wert = 1; // dann etnweder in ptr gespeichert oder per funktion(&wert); // übergeben }
die oben beschrieben Weise war mir halt neu.
-
Kann es sein, dass du da Bücher und Tutorials über C statt über C++ liest? Dort macht man das nämlich tatsächlich so, weil es in C keine Referenzen gibt.
-
funktion(int* ptr)
und
funktion(int& ptr)
sind nicht das gleiche!
Das musst du wirklich genau nachlesen. Diesen Unterschied zu kennen ist fundemtal um C++ zu koennen.
Welches Tutorial liest du denn?
-
Du kannst dir Referenzen intern schon wie Pointer vorstellen, aber semantisch sind sie doch etwas anderes. Ja, eine Referenz zeigt wie ein Zeiger auf ein Objekt. Allerdings: Nur auf ein gültiges Objekt. Es gibt in der Sprache keine Nullreferenzen. (Durch wildes Gecaste kann man die zwar erzeugen, aber das ist nicht vorgesehen.)
Zudem zeigt eine Referenz auch immer auf genau ein Objekt, du kannst sie nicht wie einen Zeiger verschieben. Bei Referenzen entfällt zudem die Dereferenzierungssyntax. (Was die ganzen vorangegangenen Dinge sehr logisch macht, denn jeder Test oder jedes ++/-- würde ja auf das Objekt selbst und nicht auf die Referenz angewendet werden.)void foo(int& i) { i = 5; // i ist jetzt auch außerhalb der Funktion 5 }
Wenn du also Objekte hast von denen du in einer Funktion nur lesen willst, dann erwarte sie via const&. Dann muss nicht kopiert werden, und das const sagt dem Aufrufer, dass du das Objekt hinter der Referenz nicht veränderst. Zudem kannst du davon ausgehen, dass niemand dir eine Nullreferenz übergibt. (Also immer wenn du wirklich nur ein Objekt übergeben willst ohne es zu kopieren, nimm Referenzen.)
-
Also Buchmaterial hab ich hier folgendes:
Dirk Louis - C++ programmieren mit einfachen Beispielen - M&T Verlag
Helmut Erlenkötter - C++ OOP von Anfang an.Online Materialien die ich zur Info nutze:
http://en.cppreference.com/w/cpp
http://www.brpreiss.com/books/opus4/html/book.html (Das Einzige wo cih etwas in der Art gefunden habe)
http://upload.wikimedia.org/wikibooks/de/5/59/Cplusplus.pdf
http://www.cplusplus.com/
http://www.cprogramming.com/tutorial.htmlUnd dann hab ich noch von einem Freund hier liegen C++ Primer Fifth Edition. (den bin ich grade am lesen btw.)
Sich C++ autodidaktisch zu erarbeiten ist teilweise mit vielen echten Stolperfallen versehen ....
-
Danke dir Cookie, das erklärt es besser als ich es irgendwo online gefunden habe.
-
cooky451 schrieb:
[...] (Durch wildes Gecaste kann man [nullref] zwar erzeugen, aber das ist nicht vorgesehen.)
Glaub' ich Dir nicht. Zeig' mal! :p
-
-
Schon. Aber das Dereferenzieren eines nullptr ist UB.
-
Ja..... .. . .. . .. . und?
-
Wer sagt Dir, daß bei UB eine Nullreferenz 'rauskommt?
-
Das meinst du nicht ernst.
-
Warum soll ich das nicht ernst meinen? Du wolltest mir zeigen, wie Du mit "wildem gecaste" eine Nullreferenz bastelst. Dein Code darf sich aber schon bei der Dereferenzierung mit Fug und Recht in Rauch auflösen.
-
Swordfish schrieb:
Warum soll ich das nicht ernst meinen? Du wolltest mir zeigen, wie Du mit "wildem gecaste" eine Nullreferenz bastelst.
Ja, also eine Referenz auf ein Objekt das nie existiert hat (und insbesondere Namenlos ist), ohne das der Compiler etwas davon mitbekommt.
-
Ein Ansatz, der ohne
*nullptr
auskommt, wär' zB. http://ideone.com/nWopP
Ob das legal ist, trau' ich mir aber nicht sagen.
-
Swordfish schrieb:
Ein Ansatz, der ohne
*nullptr
auskommt, wär' zB. http://ideone.com/nWopP
Ob das legal ist, trau' ich mir aber nicht sagen.Ist es nicht. Referenzen sind sprachlich gesehen keine Pointer, sondern eben nur Aliase:
8.3.2/4 schrieb:
It is unspecified whether or not a reference requires storage
Deswegen sind im Sinne der Sprache auch alle Fragen nach einer Nullreferenz nach dem Kompiliervorgang nicht sinnvoll.
-
... und ich könnt' jetzt sagen:
cooky451 schrieb:
Ja..... .. . .. . .. . und?
oder wir einigen uns d'rauf, daß auch durch wildes gecaste nie eine Nullreferenz 'rauskommen wird
...
-
Swordfish schrieb:
oder wir einigen uns d'rauf, daß auch durch wildes gecaste nie eine Nullreferenz
Oder einigen uns darauf, dass die Frage nach einer Nullreferenz im Sinne eines Pointers der == nullptr ist keinen Sinn macht, und dass man in C++ alle Referenzen Nullreferenzen nennen kann, die auf etwas Zeigen, was nie ein Objekt war. :p