void pointer Frage



  • Ty für die Antworten.

    Aber das Programm stürtzt nicht ab.
    Den Quelltext hab ich aus dem C++ Primer.

    Das steht in dem C++ Primer zum void pointer:

    Once you assign to a void* you lose any information about what
    type it is. This means that before you can use the pointer, you must
    
    cast it to the correct type:
    //: C03:CastFromVoidPointer.cpp
    
    int main() {
    int i = 99;
    3: The C in C++ 155
    
    void* vp = &i;
    // Can't dereference a void pointer:
    // *vp = 3; // Compile-time error
    
    // Must cast back to int before dereferencing:
    *((int*)vp) = 3;
    
    } ///:~
    The cast (int*)vp takes the void* and tells the compiler to treat it as
    
    an int*, and thus it can be successfully dereferenced. You might
    observe that this syntax is ugly, and it is, but it’s worse than that –
    
    the void* introduces a hole in the language’s type system. That is, it
    allows, or even promotes, the treatment of one type as another
    
    type. In the example above, I treat an int as an int by casting vp to
    an int*, but there’s nothing that says I can’t cast it to a char* or
    
    double*, which would modify a different amount of storage that
    had been allocated for the int, possibly crashing the program. In
    
    general, void pointers should be avoided, and used only in rare
    special cases, the likes of which you won’t be ready to consider
    
    until significantly later in the book.
    
    You cannot have a void reference, for reasons that will be explained
    in Chapter 11.
    


  • void *ptr schrieb:

    Aber das Programm stürtzt nicht ab.
    Den Quelltext hab ich aus dem C++ Primer.

    Da steht ja auch
    void* vp = &i;
    und nicht
    void *vp;



  • sagte doch das buch ist nicht zielführend...



  • no_code schrieb:

    sagte doch das buch ist nicht zielführend...

    In welchem Zusammenhang stellst du jetzt diese Behauptung auf?



  • findest du das buch nicht ein bichen zu umfangreich mit zuviel text und zuwenig infos?



  • http://www.cppreference.com/wiki/operator_precedence

    Dieser Cast-Operator und der Dereference-Operator haben die gleiche Priorität (3).
    Bei gleicher Priorität (3) ist die Abarbeitungsreihenfolge right-to-left.
    D.h.: Es wird zuerst gecastet und dann dereferenziert.

    Und wie wxSkip bereits erwähnte, stürtzt das Programm, in dieser Art, in den meisten Fällen ab, und zwar einfach deswegen, da dein Pointer irgendwo hinzeigt, wo er gerade Bock drauf hat ... in deinem Fall hast du wohl Glück.

    no_code schrieb:

    sagte doch das buch ist nicht zielführend...

    Augen auf, Mund zu :p ---> In dem Beispielcode des Primers zeigt der Pointer auf eine zuvor definierte Variable.



  • Dweb schrieb:

    no_code schrieb:

    sagte doch das buch ist nicht zielführend...

    Augen auf, Mund zu :p ---> In dem Beispielcode des Primers zeigt der Pointer auf eine zuvor definierte Variable.

    ich sagte auch nicht das buch sei falsch...

    edit: naja wobei über die klammern kann man dann ja diskutieren



  • Dweb schrieb:

    Dieser Cast-Operator und der Dereference-Operator haben die gleiche Priorität (3).
    Bei gleicher Priorität (3) ist die Abarbeitungsreihenfolge right-to-left.
    D.h.: Es wird zuerst gecastet und dann dereferenziert.

    Warum einfach, wenn es auch kompliziert geht?

    Es gibt bei mehreren unären Prefix-Operatoren überhaupt keine Mehrdeutigkeit, die man auflösen müsste: op1 op2 x heißt immer op1 (op2 x). (op1 op2) x ist syntaktisch sinnlos.

    Prioritäten ergeben nur Sinn, wenn es Mehrdeutigkeiten gibt, z.B. bei *x++. Heißt das jetzt (*x)++ oder *(x++)? (Letzteres).

    Assoziativitäten ergeben nur Sinn bei mehrstelligen Operatoren. Heißt a = b = c jetzt (a = b) = c oder a = (b = c)? (Letzteres, = ist rechtsassoziativ).



  • no_code schrieb:

    findest du das buch nicht ein bichen zu umfangreich mit zuviel text und zuwenig infos?

    CXXPrimer::GetInstance().Text().substr(Beispieltext.start(), Beispieltext.length()).IsInfo() == true 😃



  • wxSkip schrieb:

    CXXPrimer::GetInstance().Text().substr(Beispieltext.start(), Beispieltext.length()).IsInfo() == true 😃

    Der Code legt nahe, dass es nur ein Exemplar des Primer gibt. Das ist falsch.
    Am besten greifst du so darauf zu:

    PersonalLibraryManager::findBook("C++ Primer").take()->[usw];
    


  • l'abra d'or schrieb:

    wxSkip schrieb:

    CXXPrimer::GetInstance().Text().substr(Beispieltext.start(), Beispieltext.length()).IsInfo() == true 😃

    Der Code legt nahe, dass es nur ein Exemplar des Primer gibt. Das ist falsch.
    Am besten greifst du so darauf zu:

    PersonalLibraryManager::findBook("C++ Primer").take()->[usw];
    

    (Das vorher war die Internetausgabe 🙄 )
    Noch besser wird's:

    home::shelf<Objects::Book>::iterator iter = Bookshelf.findBook("C++ Primer", Language::English);
    if(iter == Bookshelf.end())
    {
        try
        {
            iter = Bookshelf.AddBook(*(Objects::Book*)this->Buy(Buyable::Book, "C++ Primer", Language::English);
        }
        catch(LowMoneyException err)
        {
            std::cout << "Zu wenig Geld für den Kauf des C++ Primers vorhanden" << std::endl;
            break;
        }
        catch(NotAvailableException err)
        {
            std::cout << "Den C++ Primer gibt es momentan nicht zu kaufen" << std::endl;
            break;
        }
    }
    
    std::cout << iter->GetRawText().substr(Beispieltext.RawTextStart(), Beispieltext.RawTextLength()).IsInfo() << std::endl;
    //Ausgabe: "1\n"
    


  • 😑


Anmelden zum Antworten