void Zeiger - Casten vor Zuweisung?



  • Hallo zusammen,
    Ich bin auf das hier gestoßen und verwundert:

    http://openbook.galileocomputing.de/c_von_a_bis_z/012_c_zeiger_011.htm#mj73b6b10a1e5c84bb6227972822059e40

    zum Beispiel in Listing 4(verkürzt):

    int main(void) {
       void *void_ptr;
       int wert = 10;
    
       void_ptr=(int *)&wert;
       ...
    }
    

    Meine Frage: Warum wird der hier vor der Zuweisung nach (int 😉 gecastet? Eigentlich ist doch "&wert" schon ein int-Pointer, oder?



  • Ja, &wert ist bereits ein Zeiger auf int, der Cast ist unnötig.

    Ansonsten zu deinem Buch:WARNUNG: Bücher von Jürgen Wolf zu C und C++ zum Lernen ungeeignet weil...

    edit: Hab grad mal in den von dir verlinkten Abschnitt reingelesen. Da wird einem ja schlecht.



  • Danke, du hast mein Weltbild gerettet 😃
    Leider ist das nicht das erste mal das ich so etwas gelesen/gehört hab. Die Allgemeinheit scheint dieses Werk ja zu schätzen ...



  • Seit wann ist ein void Zeiger denn typenlos, ich dachte immer sein Typ wäre Zeiger auf void? Da hat der gute J.W. mich jetzt aber verwirrt. 😃



  • void ohne * ist ein Schlüsselwort und kein Typ, void* ein Zeigertyp, beide haben somit nichts miteinander zu tun.



  • Wutz schrieb:

    void ohne * ist ein Schlüsselwort und kein Typ, void* ein Zeigertyp, beide haben somit nichts miteinander zu tun.

    Das ist nicht korrekt. void ist sehr wohl ein Typ, nämlich ein Typ, dessen Wertmenge die leere Menge ist. Natürlich ist es auch ein Schlüsselwort, so wie int auch...



  • N1256 6.2.5/19

    The void type comprises an empty set of values; it is an incomplete type that cannot be completed.
    


  • Unsinn incomplete type und complete type miteinander vergleichen zu wollen.
    void als Parameterdeklaration bezeichnet eine leere Parameterliste (hat nichts mit Typen zu tun) und void als Returnwertdeklarator einer Funktion ist Teil des Funktionszeigertyps (und wieder kein eigener Typ).



  • Wutz schrieb:

    Unsinn incomplete type und complete type miteinander vergleichen zu wollen.

    😕

    Wutz schrieb:

    void als Parameterdeklaration bezeichnet eine leere Parameterliste (hat nichts mit Typen zu tun)[...]

    korrekt

    Wutz schrieb:

    [...] und void als Returnwertdeklarator einer Funktion ist Teil des Funktionszeigertyps (und wieder kein eigener Typ).

    falsch

    void foo();
    

    Deklariert eine Funktion deren Rücktabetyp void ist. Sowohl in C (§6.7.6.3) als auch in C++ (§8.3.5).



  • Wutz schrieb:

    Unsinn

    Unsinn ist das Mundwerk aufzureissen, klugscheissen zu wollen und dabei einfach nur Müll zu verzapfen.



  • Die Behauptung, void sei kein Typ, ist völlig absurd. Der Standard spricht fortlaufend vom Typen void, also ist void ein Typ. Die Funktionsliste (void) allerdings hat tatsächlich nichts mit dem Typen void zu tun, sondern ist in C99, 6.7.5.3 (10) explizit als Sonderfall benannt.

    Dass man unvollständige und vollständige Typen nicht miteinander vergleichen könne, ist insofern eine lustige Sichtweise, als dass der Standard einen solchen Vergleich anstellt.

    Tim schrieb:

    Unsinn ist das Mundwerk aufzureissen, klugscheissen zu wollen und dabei einfach nur Müll zu verzapfen.

    Darin hat er ja Übung.


Anmelden zum Antworten