Verständnisproblem mit void



  • Ich lese häufig sachen wie:

    void *irgendwas;
    
    oder
    
    blabla *irgendwas;
    (void**)&irgendwas;
    

    Was bedeutet das? was ist der sinn und zweck dabei? void ist ja kein datentyp oder so. Kann mir das mal bitte jemand erklären?

    THX



  • Ein Zeiger auf void ist eine Konstruktion, die vor allem in C verwendet wird. Man kann es als Zeiger auf "irgendetwas" verstehen. Auf Sachen wie Typsicherheit musst du in diesem Fall aber verzichten. Alle zeiger können implizit in einen void * konvertiert werden. Die C-StdLib arbeitet häufig mit void-Zeiger (siehe zum Bleistift printf; dort wird der Datentyp des Objekts auf das der void-Zeiger zeigt mit dem Formatstring angegeben.).



  • Ah, danke. das klärt nun einiges. hab ich mir schon fast gedacht mit zeiger auf irgendwas. solche sachen begegnen mir häufig in dx.

    Bei dem 2. bsp versteh ich aber nicht direkt warum man dort (void**)&irgendwas eingeben muß. die funktion verlangt zb einen void zeiger. warum kann ich da nicht (void)irgendwas schreiben?



  • Weil void alleine für soviel wie "nichts" steht. Und du kannst keine Instanz von "nichts" haben.



  • VirtualDreams schrieb:

    Bei dem 2. bsp versteh ich aber nicht direkt warum man dort (void**)&irgendwas eingeben muß. die funktion verlangt zb einen void zeiger. warum kann ich da nicht (void)irgendwas schreiben?

    void** und blabla** sind völlig unterschiedliche Typen. blabla* kann zwar problemlos in void* konvertiert werden, aber bei Zeigern auf Zeigern sieht das anders aus.
    Ersetzte void durch frucht und blabla durch birne. Eine birne* kann zwar problemlos in frucht* konvertiert werden, aber birne** nicht in frucht**. Warum das so ist, soll das Beispiel verdeutlichen.
    Manchmal braucht man es aber doch (aus welchen Gründen auch immer...) und dann entstehen solche wilden Typumwandlungen.

    class frucht
    {
    public:
    	virtual ~frucht() {}
    };
    class apfel : public frucht { };
    class birne : public frucht { };
    
    int main ()
    {
    	birne* einebirne;
    	frucht** p = &einebirne; // Typecast wird benötigt - p = reinterpret_cast<frucht**>(&einebirne); 
    	*p = new apfel; // hoppla - einebirne zeigt jetzt auf einen Apfel!
    }
    

Anmelden zum Antworten