Worin liegt der Sinn von Zeigern und Referenzen
-
Hallo
Ich habe vor ca 1nem Monat angefangen mir mithilfe des Buchs :
Einstieg in Visual C++ 2008 | ISBN: 3836211939
C++ beizubringen .
Im Moment hänge ich bei den Zeigern und Referenzen .
Ich verstehe nicht ganz wofür diese von nutzen sind .
Referenzen sind ja dazu da um z.B für eine Variable noch einen anderen Namen zu haben und in Zeigern kann man die Adressen speicher .
Aber wozu braucht man das ?
Für manche die meisten mag meine Frage albern klingen aber ich versuche irgendwie in die Materie reinzukommen .
Falls jemand Tipps für mich hat nehme ich diese gerne entgegen .
Danke
-
Basti123 schrieb:
Aber wozu braucht man das ?
Die Frage kommt hier irgendwie alle paar Wochen mal, was ist daran so schwer zu verstehen? Angenommen du hast ein großes Objekt, z.B. einen String. Und jetzt willst du diesen String in einer Funktion lesen können.
1. Möglichkeit: Pointer auf den Anfang des Speichers übergeben. (Etwa 4-8 Byte kopiert.)
2. Möglichkeit: Den ganzen String kopieren.Abgesehen davon kannst du technisch gesehen ohne Pointer nicht mal Datenstrukturen wie Listen etc. modellieren. Genau genommen geht ohne Pointer eigentlich überhaupt nichts im PC, wie willst du denn auf Speicher zugreifen? Irgendwie zeigt die Frage, dass du von dem, was im Computer eigentlich passiert, noch so gar keine Vorstellung hast.
-
Referenzen werden interessant als Funktionsparameter:
void foo(int &a) { a = 2; } int main() { int bar = 0; foo(bar); // bar == 2 }
Dies ist dir grundlegende Anwendung. Es gibt noch andere, aber ich hoffe du siehst, wie so etwas nützlich sein kann.
Pointer sind ähnlich wie Referenzen. Im Prinzip sind sie das maschinennahe Äquivalent der Referenz. Wichtige Unterschiede sind, dass man den Wert einer Pointervariable (also das Ziel auf das der Pointer zeigt) ändern kann, während eine Referenz sich immer auf das gleiche Objekt bezieht. Außerdem kann man einem Pointer auch absichtlich ungültige Sonderwerte zuweisen, zum Beispiel den berühmten Nullpointer. Pointer sind ganz grundlegend um überhaupt komplexe Datenstrukturen aufzubauen. Das verstehst du jetzt vermutlich nicht, aber es gibt fundamentale Gründe, warum man für höhere Datenstrukturen (wie die list, map, set und ähnliche aus der C++-Standardbiblithek (die du vermutlich auch noch nicht kennst)) eine Art von indirektem Verweis benötigt. Pointer sind eine Mögliche Umsetzung eines solchen Verweises, die sich sehr daran orientiert, wie ein Computer intern arbeitet.
Pointer werden dir so direkt in C++ eher selten begegnen, meistens wirst du mit den fertigen Datenstrukturen der Standardbibliothek auskommen. Aber wenn du sie brauchst, dann sind sie da. Außerdem brauchst du ein gewisses Grundwissen über Pointer, wenn du mal mit C-Bibliotheken zu tun hast, da es in C nur Pointer, aber keine Referenzen, gibt.
Autor und Verlag des Buches lassen übrigens nichts gutes ahnen. Die sind beide berüchtigt in diesem Forum. Außerdem sind C++/CLI und C++ zwei unterschiedliche Sprachen. Im Prinzip sehe ich keinen Grund, heute noch mit C++/CLI anzufangen, dann doch entweder gleich C# oder C++. Und Windows Forms und C++ für grafische Oberflächen hat sogar einen eigenen Warnthread hier im Forum bekommen:
http://www.c-plusplus.net/forum/263084
-
Vielleicht sollte noch hinzugefügt werden, dass eine Referenz intern auch nur ein konstanter Zeiger (also ein Zeiger mit unveränderlichem Pointee) ist.
Auch noch mal erwähnenswert: http://www.parashift.com/c++-faq/refs-vs-ptrs.html
Vielleicht auch mal angucken: http://www.youtube.com/watch?v=6pmWojisM_E
-
Sone schrieb:
Vielleicht sollte noch hinzugefügt werden, dass eine Referenz intern auch nur ein konstanter Zeiger (also ein Zeiger mit unveränderlichem Pointee) ist.
Besser nicht. Referenzen und Zeiger sind sich zwar ähnlich, aber dann doch auch wieder grundverschieden...
Was man dagegen nicht stark genug hervorheben kann: C++/CLI ist nicht C++ und ganz besonders für Anfänger völlig ungeeignet. Ich würd an deiner Stelle unbedingt die Finger von dem Buch lassen und mir ein besseres Buch besorgen...
-
dot schrieb:
Sone schrieb:
Vielleicht sollte noch hinzugefügt werden, dass eine Referenz intern auch nur ein konstanter Zeiger (also ein Zeiger mit unveränderlichem Pointee) ist.
Besser nicht. Referenzen und Zeiger sind sich zwar ähnlich, aber dann doch auch wieder grundverschieden...
Nein, der Punkt war, dass der TE versteht wie Referenzen funktionieren.
Klar, dass man Referenzen nicht als konstante Zeiger behandeln sollte
-
Sone schrieb:
dot schrieb:
Sone schrieb:
Vielleicht sollte noch hinzugefügt werden, dass eine Referenz intern auch nur ein konstanter Zeiger (also ein Zeiger mit unveränderlichem Pointee) ist.
Besser nicht. Referenzen und Zeiger sind sich zwar ähnlich, aber dann doch auch wieder grundverschieden...
Nein, der Punkt war, dass der TE versteht wie Referenzen funktionieren.
Referenzen sind aber eben keine Zeiger, sondern Referenzen. Die Tatsache, dass der Compiler Referenzen unter gewissen Umständen im generierten Maschinencode auf Adressen abbildet, bedeutet noch lange nicht, dass Referenzen einfach nur Zeiger sind. So eine Aussage ist genauso falsch und irreführend wie "Arrays sind nur Zeiger" etc. Es gibt wesentliche Unterschiede zwischen Referenzen und Zeigern, das fängt z.B. schonmal dabei an, dass Zeiger eigenständige Objekte sind und Referenzen nicht...
Sone schrieb:
Klar, dass man Referenzen nicht als konstante Zeiger behandeln sollte
...