Guybrush Threepwood Geschrieben 16. Dezember 2002 Teilen Geschrieben 16. Dezember 2002 Hi, warum geht das: char test='h'; char* t = &test; char z = *t; [/PHP] aber das nicht: [PHP] char test='h'; void* t = &test; char z = (char)*t; Ich dachte eigentlich das void* eine Art universeller bzw typenloser Zeiger wäre. Gruß Guybrush Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 16. Dezember 2002 Teilen Geschrieben 16. Dezember 2002 Originally posted by Guybrush Threepwood Ich dachte eigentlich das void* eine Art universeller bzw typenloser Zeiger wäre. So könnte man es nennen. Man kann jeden Zeiger implizit in einen void* konvertieren. Aber dereferenzieren kannst Du einen void* nicht. Was soll dabei auch rauskommen? Das hier geht: char z = *((char*)t); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 16. Dezember 2002 Autor Teilen Geschrieben 16. Dezember 2002 Was soll dabei auch rauskommen? Ja, aber ein Zeiger ist doch nichts anderes wie die Adresse eines anderen Werts im Speicher. char *t sagt doch dann nicht das der Zeiger vom Typ char ist, sondern der Wert in der Adresse auf die t zeigt. Demnach müßte es doch reichen wenn ich ihm durch (char) sage das er den Wert als char oder sonst was interpretieren soll. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 16. Dezember 2002 Teilen Geschrieben 16. Dezember 2002 Das sind aber zwei Schritte: 1. Dereferenzierung von t, dabei wird ein temporäres Objekt erzeugt 2. Umwandlung des temporären Objekts in char Der Compiler scheitert am ersten Schritt, weil der Datentyp des temporären Objekts void wäre. Und genau wie Du keine void-Variable anlegen kannst, muss auch der Compiler hier die Flügel strecken. Wenn Du die Reihenfolge änderst: 1. Umwandlung von t in char*, auch dabei entsteht ein temporäres Objekt 2. Dereferenzierung des temporären Objekts dann geht alles klar. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Crush Geschrieben 16. Dezember 2002 Teilen Geschrieben 16. Dezember 2002 Zeiger muß man aber immer zuerst dereferenzieren, sonst kann der Inhalt der Zieladresse nicht ausgelesen werden. Ist doch von daher klar, daß man einen Zeiger selbst nicht als char auslesen kann. Wenn der Compiler nicht meckern würde, würde man sicherlich tausendfach Fehlzugriffe in Programmen machen. Zeiger sind gefährlich! (v.a. wenn man sie noch nicht ganz durchschaut) Was Du da probieren willst ist das hier: char v='a'; void * pv=&v; char u=(char&)pv; // Zeiger selbst als char char t=u; // Kopie davon und das ist ziemlich böse, weil einfach die Adresse von pv als char ausgelesen wird, was an sich ziemlich blödsinnig ist. Jedenfalls könnte ich mir dafür keine sinnige Verwendung vorstellen. Das vom Klotzkopp ist der richtige Weg, obwohl man den eher so gehen sollte: char u=*static_cast<char*>(pv); // mit Absicht unschön, aber dafür auffälliger, das hier was Komisches vor sich geht. Arbeite lieber mit Unions, wenn Du vor hast Typen u.U als was anderes auszulesen. Die hatte man dafür eigentlich auch vorgesehen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 17. Dezember 2002 Autor Teilen Geschrieben 17. Dezember 2002 Was ich aber immer noch nicht verstehe ist warum der Compiler hierbei: char z = (char)*t; [/PHP] sagt das eine Zeigeroperation ungültig ist.? Gruß Guybrush Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
gugelhupf Geschrieben 17. Dezember 2002 Teilen Geschrieben 17. Dezember 2002 Originally posted by Guybrush Threepwood char z = (char)*t; Ich denke, dass es deshalb nich geht weil versucht wird eine Dereferenzierung auf einen unbestimmten Typ (void*) durchzuführen. Der Compiler weiss nicht wieviel Speicherstellen er zu einem Typ zusammenfassen muss. Das (char) davor ist ja nur eine Cast-Anweisung des zurückgelieferten Wertes und hat auf die Dereferenzierung keinen Einfluss. Es geht hier IMHO um Offsets. int y=10; int *x=&y; Bei der Dereferenzierung weiss der Compiler durch den int-Typ, dass er hier 4 Bytes als zusammengehörig ansehen darf. char z='g'; char *g=&z; Hier ist es eben 1 Byte ausgehend von der Zeigeradresse. Bei einem void-Typ ist natürlich der Offset unbestimmt und der Compiler kennt die "Länge" der logischen Einheit nicht. Deswegen muss man auch beo void*-Typen immer zuerst eine Cast-Typ-Angabe machen, eben wie oben geschrieben ((char)t). Falls das alles sehr ungeschickt ausgerückt ist...i am sorry for that . Es ist halt erst 8.30 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 17. Dezember 2002 Autor Teilen Geschrieben 17. Dezember 2002 Falls das alles sehr ungeschickt ausgerückt ist...i am sorry for that . Es ist halt erst 8.30 Ne, jetzt hab ich`s gepeilt, danke! Gruß Guybrush Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.