NULL



  • 0 ist in c ein Integer literal
    durch das casten wird dieser integer literal
    zu einer adresse von type void pointer

    und da bei c einen void pointer impliziet zu jeden anderen pointertype
    convertiert wird ist es allgemein und kann überall verwendet werden

    void* a = NULL;
    int* b = a; // ok impliziete convertirung
    
    float* c = b; // error brauche expliziete convertirung
    float* c = (float*)b; // ok expliziete convertirung
    
    // nur ein Beispiel sowas soll man nicht tun
    

    warum das c++ anders macht weiss ich nicht!



  • bandit90 schrieb:

    ((void *)0)
    

    warum ist NULL in C so definiert und in C++ nur als 0? wozu (void*) in C??danke

    in c reicht auch die einfache 0.
    http://c-faq.com/null/macro.html

    c fanboy schrieb:

    void* a = NULL;
    int* b = a; // ok impliziete convertirung
    
    float* c = b; // error brauche expliziete convertirung
    

    damit hast du dargestellt, dass int* nicht implizit in float* umgewandelt wird (wie überraschend!). aber was hat das mit der frage zu tun?



  • c fanboy schrieb:

    void* a = NULL;
    int* b = a; // ok impliziete convertirung
    
    float* c = b; // error brauche expliziete convertirung
    

    damit hast du dargestellt, dass int* nicht implizit in float* umgewandelt wird (wie überraschend!). aber was hat das mit der frage zu tun?

    wollte nur den unterschied zwischen implizit und explizit deutlich machen



  • in C++ gibt es keine implizite Umwandlung von void* in irgendwelche andere Pointer, deswegen müsste man in C++, wenn NULL so definiert wäre es erst jedesmal in den richtigen Pointertyp casten.
    nullptr wird in C++ bald übernehmen und man kann es bereits jetzt als Klasse schreiben, wenn man z.B. bei Überladungen Probleme mit int hat.



  • ja das ist mir klar aber in was für situationen brauche ich in c schon (void*)0 statt 0?



  • bandit90 schrieb:

    ja das ist mir klar aber in was für situationen brauche ich in c schon (void*)0 statt 0?

    Wenn du willst, dass sowas zu einem Fehler führt:

    int var = NULL;
    


  • JustAnotherNoob schrieb:

    nullptr wird in C++ bald übernehmen...

    und das ist dann gleichbedeutend mit (void*)0, nur als extra keyword, oder was?
    🙂



  • wenn du void in Funktionen meinst:

    Das Schlüsselwort "void" kannst du überall dort einsetzen, wo der Compiler eine Typenangabe erwartet, du aber keinen Typ angeben willst ( Undefined ) oder kannst.

    bsp:

    void func_sinnlos()
    {
    printf("Funktionsaufruf");
    }

    *EDIT* m vor Typenangabe entfehrnt



  • Unregistered schrieb:

    Das Schlüsselwort "void" kannst du überall dort einsetzen, wo der Compiler eine Typenangabe erwartet, du aber keinen Typ angeben willst ( Undefined ) oder kannst.

    bsp:

    void Var;

    das geht in C nicht. aber wahrscheinlich meinst du 'void pointer'.
    🙂



  • +fricky schrieb:

    Unregistered schrieb:

    Das Schlüsselwort "void" kannst du überall dort einsetzen, wo der Compiler eine Typenangabe erwartet, du aber keinen Typ angeben willst ( Undefined ) oder kannst.

    bsp:

    void Var;

    das geht in C nicht. aber wahrscheinlich meinst du 'void pointer'.
    🙂

    nein eigentlich nicht...

    probiers aus 😉



  • doch meinst du 😉



  • Unregistered schrieb:

    probiers aus

    brauch ich nicht. ich denke mir einfach, dass der compiler beim anlegen eines objekts die grösse kennen muss. daher verbietet sich ein void var; von selbst.
    🙂



  • sie dir das an:

    #include <stdio.h>

    void func_sinnlos()
    {
    printf("Ich bin eine sinnlose Funktion\n");
    }

    int main()
    {
    func_sinnlos();
    return 0;
    }

    Compiler ma das ^^ * wie nennt man das gleich? Compilier? ... egal *

    shit geht echt nich verdammt:

    #inlcude <studio.h>

    int main()
    {
    void var; //Variablen deklarartion
    var=1;

    printf("%d",var); //Bildschirmausgabe

    system("PAUSE"); //systembefehl
    return 0; // wüsste wo gern was?
    }



  • 1. verwende CPP Tags

    Unregistered schrieb:

    #include <stdio.h>
    
    void func_sinnlos()
    {
        printf("Ich bin eine sinnlose Funktion\n");
    }
    
    int main()
    {
        func_sinnlos();
        return 0;
    }
    

    2. Scherzkeks, es geht um Variablen.

    Unregistered schrieb:

    #inlcude <studio.h>
    
    int main()
    {
            void var; //Variablen deklarartion
            var=1;
        
            printf("%d",var);  //Bildschirmausgabe
        
    system("PAUSE");  //systembefehl
    return 0; // wüsste wo gern was?
    }
    

    3. Wenn dein C Compiler das compiliert, dann schmeiß ihn weg. Das ist nicht kompilierbar. Und wenn du es nicht besser weißt (immerhin hast du in einem anderen Thread gezeigt, dass du nicht mal den Unterschied zwischen C und C# kennst), dann verkaufe uns hier keine Unwahrheiten.



  • +fricky schrieb:

    JustAnotherNoob schrieb:

    nullptr wird in C++ bald übernehmen...

    und das ist dann gleichbedeutend mit (void*)0, nur als extra keyword, oder was?
    🙂

    nein, das ist eher gleichbedeutend mit 0.

    Aber siehe http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1601.pdf, da ist die Motivation gut erklärt.



  • rüdiger schrieb:

    Aber siehe http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1601.pdf, da ist die Motivation gut erklärt.

    aha, auf lustige ideen kommen manche. aber sie hätten besser verbieten sollen, dass man 'nem pointer eine 0 zuweisen kann:

    char* ch = nullptr; // ch has the null pointer value
    char* ch2 = 0; // ch2 has the null pointer value
    

    ^^ geht beides aus kompatibilitätsgründen

    if (ch == ch2); // true, nehme ich an
    if( nullptr == 0 ); // error
    

    ^^das finde ich irgendwie doof. der cpp-kenner weiss vielleicht, dass pointer und ints was anderes sind, aber den anfänger verwirrt der widerspruch mit den zuweisungen da oben.



  • @Unregistered:
    Bitte schreib keinen Müll zu Dingen von denen du offensichtlich überhaupt keine Ahnung hast.
    C++ lernt man eben nicht in ein paar Tagen.



  • ^^das finde ich irgendwie doof. der cpp-kenner weiss vielleicht, dass pointer und ints was anderes sind, aber den anfänger verwirrt der widerspruch mit den zuweisungen da oben.

    Das Ziel von C++0x war die Sprache effizienter zu machen und nicht sie einfacher zu machen. Für Anfänger ist die Sprache eh ein Hammer, aber danach würde ich eine Sprache eh nicht designen(es sei denn sie ist zu Lehrzwecken).



  • rüdiger schrieb:

    +fricky schrieb:

    JustAnotherNoob schrieb:

    nullptr wird in C++ bald übernehmen...

    und das ist dann gleichbedeutend mit (void*)0, nur als extra keyword, oder was?
    🙂

    nein, das ist eher gleichbedeutend mit 0.

    Aber siehe http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1601.pdf, da ist die Motivation gut erklärt.

    Das ist der C++ Weg

    const                        // this is a const object...
    class {
    public:
      template<class T>          // convertible to any type
        operator T*() const      // of null non-member
        { return 0; }            // pointer...
      template<class C, class T> // or any type of null
        operator T C::*() const  // member pointer...
        { return 0; }
    private:
      void operator&() const;    // whose address can't be taken
    } nullptr = {};              // and whose name is nullptr
    

    und das der C Weg:

    #define NULL ((void *)0)
    

    😃



  • Was hat es mit dem mit "or any type of null member pointer" gekennzeichneten Codeabschnitt auf sich? Ein Zeiger auf ein Member einer Klasse, d.h. der Zeiger selbst ist kein Member der Klasse? Kann vllt. jemand ein Codebeispiel posten, bei dem die Konvertierung stattfindet?


Anmelden zum Antworten