Kristian Geschrieben 20. Oktober 2001 Geschrieben 20. Oktober 2001 Hallo Leute, Ich bin noch relativ neu bei C++ und noch dabei, die verschiedenen Konzepte zu verstehen. Deswegen eine Anfrage, ob ich das richtig verstanden habe: Also, eine Referenz ist eine Möglichkeit, auf eine Variable mit zwei Namen zu zugreifen. Dies kann sowohl in einer, als auch in mehreren Funktionen passieren: void f(int &a3) { a3=9; }; void main() { int a1=5; int &a2=a; a2=7; cout<<a1<<endl; // würde nun 7 herausgeben f(a1); cout<<a1<<endl; // ist nun 9 }; Die Gefahr bei der Sache ist aber, daß man im Hauptproggi nicht erkennt, daß die Variable in der Funktion verändert werden kann (deswegen in der Funktion nach möglichkeit mit const erzeugen) Ein Pointer ist quasi eine Referenz, die in einer eigenen Variable abgelegt wird. Mit ihm kann ich z.B. auch auf einzelne Positionen eines Arrays zugreifen (Pointer-Arithmetik). void f(int *pa) { *a=9; }; void main() { int a1=5; int *pa1=&a1; char *str="Dies ist ein String"; *pa1=7; // jetzt: a1=7 f(&a); // jetzt: a1=9 a1=1; f(pa); // jetzt wieder a1=9 cout<<str[3]<<endl; // gibt 's' aus cout<<*(str+6)<<endl; //gibt 'i' aus }; ist das so richtig, oder habe ich da noch irgendwelche argen Fehler in meiner Denkweise? Zitieren
Crush Geschrieben 20. Oktober 2001 Geschrieben 20. Oktober 2001 Der Computer hat Speicherstellen (Adressen) welche Daten beinhalten können (Werte). Anders ausgedrückt: Der Speicher des Computers beinhaltet Daten, die dadurch angesprochen werden können, daß jeder Stelle eine eindeutige Nummerierung vergeben ist, welche jedoch nicht unbedingt konstant zunimmt (Memory-Mapping-> oft zerstückelter/zusammengebastelter Speicher). Ich betrachte Referenzen als Kopien einer Adresse, auf die selbst nicht zugegriffen werden kann, sondern lediglich auf ihren Wert im Source kann man für dieselbe Referenz aber verschiedene Namen vergeben. Eine Referenz kann nicht verändert werden, deshalb ist das Const nicht für die Referenz ausschlaggebend, sondern für den Wert, den sie beinhaltet. Deshalb werden auch Referenzen verwendet um unnötige Kopien bei Funktionsaufrufen zu vermeiden (wo ja bei call-by-value die kompletten Wertinhalte auf den Stack kopiert werden und dann innerhalb der Funktion damit gearbeitet wird). Anbei gibt es auch noch das Schlüsselwort mutable mit dem konstante Werte als "kann nicht konstant sein" definiert werden (meist bei Klassenvariablen oder IO-Register oder Werte die auch von "außen" (andere Programme) oder auch von der Hardware verändert werden können ähnliches). Also im Grunde genommen ist das nur eine Frage der Betrachtungsweise, aber so wie Du´s siehst, warum nicht? Ein Zeiger ist Eine Adresse, die wiederum eine Adresse als Wert enthält, die den eigentlichen Wert beinhaltet. Deshalb kann man Zeiger auch hoch- und runterzählen oder halt einfach verändern und damit werden die Werte aus unterschiedlichen Adressen erreichbar. Zeiger auf Zeiger geht nochmal einen Schritt weiter. Der Zeiger(1) zeigt auf einen Zeiger(2) welcher auf eine Adresse zeigt(3), die einen Wert beinhaltet. Das hat Sinn, wenn mehrere Programme beispielsweise eine Änderung eines Zeigers mitbekommen sollen - und zwar parallel, damit nichts schiefläuft. Das wird z.B. bei dynamischen DLLs benutzt oder solche globalen Schnittstellen wie COM, DirectX oder ähnliche systemübergreifende Schnittstellen, die jedoch ausgetauscht werden können (oft während der Laufzeit). Es wird dann also bei einer Änderung lediglich Zeiger(2) verändert. Da alle Programme über Zeiger(1) arbeiten werden alle gleichzeitig "umgeschaltet". Vielleicht gibt es noch weitere Existenzberechtigungen (außer dem, die Newbies zu verwirren), aber mir ist da nix anderes aufgefallen. Die eigenschaft, Zeiger konstant zu halten, bzw. nicht zu vervielfältigen kann man übrigens durch sog. "Smart-Pointer" Classes erreichen. Da werden halt die Operatoren so überschrieben, daß immer nur ein aktueller Zeiger existiert, der halt irgendwo hinzeigt. Also jedenfalls so habe ich mir das ganze immer vorgestellt und so hat sich auch der ZeigerZeiger dann logisch einprägen können. Aber ich möchte nicht behaupten, daß das die politisch richtige Erklärung ist. Mal schaun, was andere so schreiben. <FONT COLOR="#a62a2a" SIZE="1">[ 21. Oktober 2001 10:17: Beitrag 3 mal editiert, zuletzt von Crush ]</font> Zitieren
Kristian Geschrieben 21. Oktober 2001 Autor Geschrieben 21. Oktober 2001 OK, danke crush, dann weiß ich ja immerhin, daß ich nicht total auf dem Holzweg bin ;-} ich kann, denke ich, mit meinem Modell arbeiten. Dennoch, hat nochjemand was dazu zu sagen? Kristian Zitieren
Crush Geschrieben 21. Oktober 2001 Geschrieben 21. Oktober 2001 Das Referenzen und Variablen auch nur Zeiger sind beweist übrigens der Assembler-Part in diesem Thread, den byte ptr sind nunmal Zeiger auf byte: http://217.115.144.9/cgi-bin/ubbcgi/ultimatebb.cgi?ubb=get_topic&f=21&t=000387#000002 Also bin ich mit meinem Modell absolut nah dran an der Realität =:-) Zitieren
gajUli Geschrieben 21. Oktober 2001 Geschrieben 21. Oktober 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Kristian: <STRONG> Dennoch, hat nochjemand was dazu zu sagen? </STRONG> Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.