hilfszeiger->next->daten = Ist so eine Anweisung möglich?
-
Hallo,
in einem Buch fand ich den Ausdruck:
hilfszeiger->next->daten =
Leider konnte ich nirgends finden, was dieser Ausdruck bedeuten soll, bzw. ob der überhaupt gültig ist, laut meinen Tests funktioniert dieser nicht.
Einzige Erklärung meinerseits wäre, das man hiermit einen Wert zugleich in 2 Elemente einer Struktur schreiben könnte, indem man beide Elemente per Zeiger zugleich dereferenziert.
In diesem Falle scheitert es aber schon durch die verschiedenen Datentypen, Text und Int.
Hier mal mein Code mit dem ich versucht habe zu Testen:
#include <iostream.h> int main() { struct elementliste { char daten[30]; elementliste* next; elementliste* last; }; elementliste* hilfszeiger; hilfszeiger = new(elementliste); hilfszeiger->next->daten = NULL; cout << hilfszeiger->daten; cout << hilfszeiger->next; return 0; }Ist so ein Ausdruck möglich, oder Syntaxmässig sowieso nicht erlaubt?
Schon mal Danke für Eure Hilfe.
Gruß
Marco
-
"hilfszeiger" ist ein Zeiger auf ein "elementliste" Objekt.
"*hilfszeiger" steht also für den dereferenzierten Zeiger, also das "elementliste" Objekt.
"hilfszeiger->next" ist bloss eine andere schreibweise für "(hilfszeiger).next", steht also für das "next" Element des "elementliste" Objekts auf das "hilfszeiger" zeigt.
Dieses Element ist wieder ein Zeiger auf ein "elementliste" Objekt.
Ergo kann dieser Zeiger erneut dereferenziert werden.
"hilfszeiger->next->daten" ist also eine andere schreibweise für "((*hilfszeiger).next).daten".
Die Anweisund ist äquivalent zu://hilfszeiger->next->daten = NULL; elementliste* h2 = hilfszeiger->next; // runtime error, da "hilfszeiger->next" nie initialisiert wurde h2->daten = NULL; // compiler error, da "daten" ein array ist.Du hast noch einiges über Zeiger und Initialisierung und C++ Syntax zu lernen

-
hustbaer schrieb:
"hilfszeiger" ist ein Zeiger auf ein "elementliste" Objekt.
"*hilfszeiger" steht also für den dereferenzierten Zeiger, also das "elementliste" Objekt.
"hilfszeiger->next" ist bloss eine andere schreibweise für "(*hilfszeiger).next", steht also für das "next" Element des "elementliste" Objekts auf das "hilfszeiger" zeigt.
Dieses Element ist wieder ein Zeiger auf ein "elementliste" Objekt.
Ergo kann dieser Zeiger erneut dereferenziert werden.OK. das war mir soweit bereits alles klar.
"hilfszeiger->next->daten" ist also eine andere schreibweise für "(*(*hilfszeiger).next).daten".
Die Anweisund ist äquivalent zu://hilfszeiger->next->daten = NULL; elementliste* h2 = hilfszeiger->next; // runtime error, da "hilfszeiger->next" nie initialisiert wurde h2->daten = NULL; // compiler error, da "daten" ein array ist.Du hast noch einiges über Zeiger und Initialisierung und C++ Syntax zu lernen

Danke, genau das wollte ich halt wissen. Habe so eine verknüfte Anweisung nirgends gefunden und auch nicht erklärt, ob sowas möglich ist und was es bewirkt. Wenn man mit Code bombadiert wird, ohne einmal aufgeklärt zu werden, was dieser bewirkt und was man damit machen kann, ist das mal schlecht.
Zu lernen habe ich sicher noch etwas, deshalb mache ich das ja gerade.
Also h2 hasst Du Dir jetzt sicher ausgedacht, es könnte ebensogut h3 oder xyz sein?
Also noch mal mit dem abgeänderten Code:
#include <iostream.h> int main() { struct elementliste { char daten[30]; elementliste* next; elementliste* last; }; elementliste* hilfszeiger; hilfszeiger = new(elementliste); hilfszeiger->next = NULL; hilfszeiger->last = NULL; strcpy(hilfszeiger->daten, "Test 1"); hilfszeiger->next = new(elementliste); hilfszeiger->next->daten = ???was könnte man hier nun reinsetzen???; cout << hilfszeiger->daten; cout << hilfszeiger->next; return 0; }Was könnte hier nun rein kommen, bei:
hilfszeiger->next->daten = ???was könnte man hier nun reinsetzen???;
Aufgrund das wir eine Zeichenkette ansprechen müsste diese ja mit strcpy befüllt werden. Eine direkte Zuweisung als = "Text" ist ja nur bei der Vereinbarung möglich. Eine neue Vereinbarung wurde ja wohl durch ein weiteres Stukturelement das mit new(elementliste); zuvor erzeugt wurde schon da. Nun kann ich da nachträglich ja nicht mehr hilfszeiger->next->daten[30] = "Sonstwas"; machen.
-
indem du wieder strcpy nimmst
allerdings wäre ein std::string anzuraten und ein tutorial über verkettete listen, so macht das nicht wirklich sinn.
ps. bitte nimm den header <iostream>
-
Also dies ist nur ein Ausschnitt aus meiner bereits funktionierenden doppelt verketteten Liste, ich weiß schon wie die funktioniert, habs halt nur mit anderen Methoden erstellt.
strcpy(hilfszeiger->next->daten, "Test 2");
Wäre dann meine Lösung. Allerdings würde ich dann ja leider nicht benutzen:
hilfszeiger->next->daten = ???was könnte man hier nun reinsetzen???;
Da weiß ich immer noch nicht was ich mit diesem Ausdruck anfangen soll, wenn ihm ein = Zeichen folgt und ich ja Zeichenketten nicht direkt zuweisen kann, sondern nur über strcpy.
-
Hat noch jemand einen Tipp für mich, bitte?
Ich habe schon den ganzen Tag gegoogelt, aber es war nirgends eine doppelt verkettete Liste als Beispiel zu finden, wo auch eine Multi-Zeiger-Dereferenzierung ala elementlist->next->daten stattfand.
-
Suseplus schrieb:
hilfszeiger->next->daten = ???was könnte man hier nun reinsetzen???;
Da weiß ich immer noch nicht was ich mit diesem Ausdruck anfangen soll, wenn ihm ein = Zeichen folgt und ich ja Zeichenketten nicht direkt zuweisen kann, sondern nur über strcpy.
Das hat mit Zeichenketten nichts zu tun. Du kannst Arrays ganz allgemein nichts zuweisen. Solange daten ein Array ist, kannst du so einen Ausdruck nicht verwenden, egal was auf der rechten Seite des Gleichheitszeichen steht.
-
OK, danke, das wollte ich ja nur noch mal bestätigt haben, dass sowas nicht möglich ist.