Zum Inhalt springen

void Zeiger


Guybrush Threepwood

Empfohlene Beiträge

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);

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...