Diskussion:C++-Programmierung/ Weitere Grundelemente/ Zeiger

Seiteninhalte werden in anderen Sprachen nicht unterstützt.
Aus Wikibooks

Bearbeitingskonflikt[Bearbeiten]

Hallo Proc, habe grad an diesem Kapitel rumeditiert, als du es verschoben hast. :-( Hier nochmal meine Version aus der Zwischenablage herkopiert...

Okay, ich habs anscheinend ohne Bearbeitungskonflikte einarbeiten können. Ich hoffe, ich hab dabei nix kaputtgemacht. --RokerHRO 12:33, 10. Mär. 2008 (CET)[Beantworten]

const char ** vs. char **[Bearbeiten]

Vielleicht solltest du noch auf dieses Problem eingehen, da ich selbst darüber schon ein paarmal gestolpert bin und ich die Erklärung dafür auch nicht immer sofort parat hatte:

http://c-faq.com/ansi/constmismatch.html

--RokerHRO 12:33, 16. Mär. 2008 (CET)[Beantworten]

Danke für den Hinweis, ich werde es mit einarbeiten sobald ich Zeit habe. Vermutlich wirds aber die Woche nichts mehr. Hab jeden Tag eine Vorprüfung. Viele Grüße --Prog 13:08, 16. Mär. 2008 (CET)[Beantworten]
Jetzt gibts da einen Artikel über Probleme mit Doppelzeigern, ohne dass die Doppelzeigern vorher eingeführt wurden, und gezeigt wurde, wofür man die braucht bzw. wofür die nützlich sind. --RokerHRO 14:06, 20. Aug. 2011 (CEST)[Beantworten]

Das Kapitel vermischt die Begriffe Variable und Objekt. Diese Begriffe sint in C++ wohl definiert und sollten nicht synonym verwendet werden. Eine sauber definierte Menge von Fachbegriffen erhöht zwar erstmal den Lernaufwand, doch dafür hat man es später sehr viel einfacher, da man dann nicht immer wieder alles wiederholen muss oder man sich sogar unabsichtlich widerspricht oder den Leser verwirrt.
Das C++-Objektmodell wird in Kapitel 1.8 im ISO-Standard erklärt und die Begriffe variable, name und weitere werden am Anfang von Kapitel 3 eingeführt. Ich denke, wir sollten uns hier schon an diese Begriffe halten. So schwer ist das ja nicht, wenn man es einmal verinnerlicht hat. Glaubt mir. :-) --RokerHRO 21:35, 1. Okt. 2008 (CEST)[Beantworten]

"Zeiger sind keine Zahlen"[Bearbeiten]

Es gilt als didaktisch ungeschickt, zu erklären, was etwas nicht ist. Beim Leser fällt dann später zu leicht das nicht im Gedächtnis weg. Da ein unbedarfter Leser, der noch nichts oder wenig über Zeiger weiß, gar nicht auf den Gedanken kommen dürfte, dass Zeiger Zahlen seien, sollte man ihm das auch nicht ausreden. Einfach erklären, was Zeiger sind, wofür man sie braucht und und was man mit ihnen machen kann, reicht aus, denke ich. --RokerHRO 21:40, 1. Okt. 2008 (CEST)[Beantworten]

"Löschen von Zeigern"[Bearbeiten]

Wenn dieses Thema hier überhaupt angerissen werden soll, dann bitte korrekt: Mit einem delete-Ausdruck (ja, delete ist ein Ausdruck, keine Anweisung!) löscht man keine Zeiger. Man zerstört ein Objekt bzw. ein Array von Objekten. Der Operand des delete-Operators muss ein Zeiger sein. Das wird zur Compilezeit bereits überprüft. Damit es dann zur Laufzeit nicht "knallt", muss dieser Zeiger auf ein Objekt (oder Array von Objekten) zeigen, welches mit einem new- (bzw. new[]-)Ausdruck angelegt wurde, oder ein Nullzeiger. Folgende Codeschnipsel sind also völlig legal: delete new int(2); oder void funny() { return delete (float*)(4711-7*673); } . Wer sieht, warum sie legal sind, hat - denke ich - das Thema verstanden. :-) --RokerHRO 21:51, 1. Okt. 2008 (CEST)[Beantworten]

int const *[Bearbeiten]

Diese Schreibweise sollte vermieden werden, zumal bei der Erklärung zu den Konstanten auch const int* verwendet wurde und diese Form sowohl einfacher zu lesen ist als auch so im Standard verwendet wird. --87.164.119.122 19:00, 17. Feb. 2009 Unterschrift nachgetragen --Prog 11:35, 3. Dez. 2010 (CET)[Beantworten]

Ich habe irgendwo angeführt warum ich diese Schreibweise vorziehe und auch in der Boost-Bibliothek wird von einigen Leuten diese Schreibweise verwendet. Nur weil das von der breiten Masse andersherum geschrieben wird, heißt das nicht, dass const int* auch besser ist. Für einen Anfänger ist es sinnvoller sich eine logische Notation zu merken als irgendeine Ausnahmeregelung. In diesem Punkt diskutiere ich auch nicht, es sei den du hast ein wirklich gutes Argument. PS: Beiträge bitte mit --~~~~ signieren. --Prog 11:35, 3. Dez. 2010 (CET)[Beantworten]

"Über globale Variablen ist bereits zur Kompilierzeit bekannt, wo sie sich innerhalb des Speichers befinden"[Bearbeiten]

Verstehe ich nicht. Ein Programm kann doch nicht selbst festlegen, wo seine Variablen später im RAM stehen. Speicherzuweisung mach doch das Betriebssystem?! --80.153.250.36 13:43, 10. Jun. 2014 (CEST)[Beantworten]

Pointer sind oft relativ - sie zeigen nicht auf "Adresse 45678", sondern auf "BasisAdresse + 12345" (in Variable 'Pointer' steht: '+12345'.)
BasisAdresse ist i.A. die Adresse, an die das OS das Programm geladen hat. Wie dann ab dort der Maschinencode aussieht und wo was steht, weis der Compiler/Linker dann schon; +12345 kann damit 'fix' bleiben, nur ganz zu Beginn muss 1* BasisAdresse korrekt gesetzt werden (macht i.A. das OS kurz vor/beim Programmstart).
Im Gegensatz dazu liefert 'new' eine Adresse irgendwo im (Anwendungs-)Adressraum, i.A. 'absolut'.
--Arilou 14:48, 13. Jun. 2018 (CEST)[Beantworten]