Pointer in C?
Hallo zusammen.
Ich habe eine sehr konkrete Frage, weshalb nicht viel Code gebraucht wird. Ich bewege mich im Raum der Sprache C.
Ich habe eine mehrfach verkettete Liste mit Elementen, die jeweils einen Pointer auf ihren Vorgänger und Nachfolger haben. Das Erste hat dann folglich die 0 als Vorgänger und das letzte Element die 0 als Nachfolger.
Sei *ptr ein Pointer auf irgend ein beliebiges Element, sagen wir einfach: ptr zeigt auf das 2. Element in der Verkettung.
Wenn ich nun durch Umlenken der Vor-und Nach-Pointer der Elemente das 2. und das 3. Element tausche (das Tauschen funktioniert einwandfrei) dann zeigt ptr auf das 3. Element. Die Frage ist warum?
Meine Überlegung:
ptr zeigt auf die Adresse (z.b. 0x2 für 2.Element) und greift durch den komponentenzugriffsoperator -> auf die einzelnen vor-und nach-pointer zu. ptr greift durch die Adresse zum Element, das heißt, man tauscht nicht die Elemente in den Speicherzellen. Man koordiniert lediglich die Pointer so um, dass das vorher 2.Element an 0x2 nun das 3. wird.
Ich merke, dass ich durch das Selbsterklären gerade zur Lösung gekommen bin, logisch. Heißt das im Umkehrschluss: Egal wie viele Pointer ich auf Stelle 0x2 zeigen lasse, werden ausnahmslos alle "hochgezählt" in der Kette.
Kann mir dennoch ein C-Veteran diesen Gedankengang validieren?
Danke im Voraus.
3 Antworten
Ja, du hast es richtig verstanden! Pointer verweisen immer auf eine bestimmte Adresse im Speicher, und wenn du die Verkettung der Elemente änderst, ohne die Elemente selbst zu ändern, bleibt die Adresse, auf die der Pointer zeigt, unverändert. Das bedeutet, dass der Pointer immer noch auf das Element zeigt, das sich an der ursprünglichen Adresse befindet, auch wenn es sich nun an einer anderen Stelle in der Verkettung befindet.
Ja. Ein Pointer ist lediglich eine Variable, die eine Adresse in dem Computer-Speicher speicher, an der sich ein bestimmtes Element befindet. Wenn Sie die Vor und Nach-Pointer der Elemente in der verketteten Liste umlenken ändern Sie lediglich die Art und Weise, wie die Elemente miteinander verbunden sind, aber nicht die tatsächlichen Elemente selbst oder die Adressen an denen sie gespeichert sind. Deshalbwerden alle Pointer, die auf das Element mit der Adresse 0x2 zeigen, nach dem Tausch des 2. und 3. Elements auf das 3. Element zeigen.
ptr zeigt immernoch an die gleiche Stelle im Speicher, also das ehemalige Element 2, das nun das neue 3 ist.
Pointer referenzieren und da Du nicht die Daten zwischen 2 und 3 umkopierst, sondern neu fädelst, zeigt ptr danach immernoch auf das gleiche Listenelement, egal welche Position es nun innehat.