Seltsamer Typecast



  • Hallo,
    mir ist ein seltsamer Typecast in einem Vorlesungsskript untergekommen, vielleicht kann mir ja jemand sagen ob das möglich ist:

    int b = 5;
    int *a = (* int) b; //Hä?

    Ist es tatsächlich möglich, von int nach *int zu casten? Ist das eine gültige Kurzform für:

    int *a;
    a = &b;

    Also wenn C++ das kann.. dann ist es toll 🙂



  • "a = (*int)b;" ist mir noch nie untergekommen, "a = (int*)b;" schon eher - und letzteres entspricht am ehesten einem reinterpret_cast<>. Damit wird der Inhalt der Variablen b als Speicheradresse gedeutet (auch eine Adresse ist intern nur ein Zahlenwert, auch wenn die Arithmetik damit ein wenig anders funktioniert). Was du mit dieser Adresse machen kannst, ist Glückssache.

    (meist wird das verwendet, um spezielle Treiber-Register anzusprechen)



  • Ok, habe das falschrum hingeschrieben, es ist natürlich (int 😉 gemeint.

    Ja, aber der Code wird will in diesem Fall den Integerwert von b nicht als Adresse verwenden. Es ist ein Fehler im Skript nehme ich an, sie übergeben der Funktion ein (int b), mit einem (int * b) sähe das anders aus..

    Vielen Dank!



  • Einen Int <--> Zeiger zu casten ist richtig, denn zeiger sind vom typ der systemgröße (und der heißt in C++ int). alles andere sollte nicht gehen, zb (char)(void*)



  • piXelshooter schrieb:

    Einen Int <--> Zeiger zu casten ist richtig, denn zeiger sind vom typ der systemgröße (und der heißt in C++ int).

    Stimmt nicht. Ich kenne mindestens einen Compiler, bei dem Zeiger 64- und Integer 32-Bit groß sind 😃



  • piXelshooter schrieb:

    Einen Int <--> Zeiger zu casten ist richtig, denn zeiger sind vom typ der systemgröße (und der heißt in C++ int). alles andere sollte nicht gehen, zb (char)(void*)

    Yo die Aussage ist ziemlicher Quatsch.
    C++ erlaubt auch mehrteilige Zeiger, z.B. Segment + Offset, dann kann ein Zeiger schnell mal 6 oder 8 oder 12 Byte gross sein, ganz egal wie gross ein int ist.
    DU PFEIFFE 😉



  • hustbaer schrieb:

    C++ erlaubt auch mehrteilige Zeiger

    Echt? Chapter&Verse?



  • Kann ich dir leider nicht bieten - aber du kannst ja im Gegenzug die Stelle suchen, wo gefordert wird, daß Zeiger und int die selbe Größe haben MÜSSEN.



  • Warum sollte ich, das ist ja offensichtlich falsch.



  • OK, formulieren wir es anders: Es gibt (afaik) keine Passage, in der der C++ Standard mehrteilige Zeiger verbietet oder die Größe eines Zeigers explizit einschränkt. Es ist ja nicht einmal gefordert, daß Zeiger auf unterschiedliche Datentypen die selbe Größe/Struktur haben (wenn das System keinen Direktzugriff auf einzelne Bytes bietet, muß der Compiler bei char* etwas tricksen).



  • @Bashar:
    Dir ist hoffentlich klar dass ich von einer mehrteiligen INTERNEN Representation gesprochen habe.
    Und das ist ganz offensichtlich richtig.



  • Kann das sein, dass ihr drei gerade ziemlich aneinander vorbeiredet? 😉



  • hustbaer schrieb:

    @Bashar:
    Dir ist hoffentlich klar dass ich von einer mehrteiligen INTERNEN Representation gesprochen habe.

    Jetzt ja. Mir kommt die Aussage nur vergleichbar vor mit "C++ erlaubt auch farbige Pointer, z.B. grüne". Solange das intern ist, wen interessiert es.



  • Bashar schrieb:

    Jetzt ja. Mir kommt die Aussage nur vergleichbar vor mit "C++ erlaubt auch farbige Pointer, z.B. grüne". Solange das intern ist, wen interessiert es.

    Den Anwedner, sobald er sowas brutales wie eine reinterpret_cast auf einen gruenen Pointer loslaesst. Denn ob intern oder nicht, wenn ein gruener Pointer als char-array interpretiert wird kommt was anderes bei raus als wenn mans mit einem roten Pointer (auf das gleiche objekt) macht 😃



  • Ich will nicht mit grünen Pointern arbeiten.



  • n grüner Pointer wär doch mal ne Sache, dann haste sogar intern am Rechner (zumindest auf (Hoch-)Sprachenebene) grüne IT



Anmelden zum Antworten