macht "NULL" überhaupt sinn?



  • macht es eigentlich sinn NULL zu verwenden?

    zeiger sind doch entweder gültig oder nicht gültig. auf was sie dann zeigen ist doch egal. wenn sie ungültig sind, ist es egal ob 0 oder NULL oder 123456 drin steht. man darf sie nicht benutzen, da sie keine gültigen werte haben. und wenn ein zeiger gültig ist, dann ist es doch ebenso egal ob da 0 oder 123456 drin steht.

    das NULL kommt doch nur von früher. wo an adresse 0 die vektortabelle stand (und auch noch immer steht:) und das man da nichts verändern durfte. aber heute mit virtueller adressierung (z.b. im protected mode der x86er prozessoren), kann ein zeiger doch auch mit 0 auf etwas gültiges zeigen.

    warum sollte man NULL verwenden? kann man nicht einfach 0 schreiben?



  • Original erstellt von <NULL>:
    warum sollte man NULL verwenden? kann man nicht einfach 0 schreiben?

    jep, in C++ verwendet man 0

    und warum es sinn machen kann einen zeiger 0 zuzuweisen sollte wohl klar sein.



  • Original erstellt von <NULL>:
    zeiger sind doch entweder gültig oder nicht gültig. auf was sie dann zeigen ist doch egal. wenn sie ungültig sind, ist es egal ob 0 oder NULL oder 123456 drin steht. man darf sie nicht benutzen, da sie keine gültigen werte haben. und wenn ein zeiger gültig ist, dann ist es doch ebenso egal ob da 0 oder 123456 drin steht.

    man kann einen Zeiger aber nicht fragen, ob er ungültig ist. Nur mit einem als ungültig definierten Zeiger, einem Nullpointer, vergleichen.

    das NULL kommt doch nur von früher. wo an adresse 0 die vektortabelle stand

    C ist etwa 10 Jahre älter als der PC.



  • Genau .....

    void * p1 = NULL;
    void * p2 = (void *)123456;
    
    delete p1;
    delete p2;
    

    Ups, irgendwo ist doch nen Unterschied 😃 zumindest in C++ 😃 Also gibt der Compiler doch nen gewissen Undueltigkeitswert vor ...

    NULL und 0 ist Geschmackssache .... Ich benutz ganz gern NULL, weil ich so nen Unterschied zwischen int's und Adressen habe ... man fuehlt sich besser bei !

    Ciao ...



  • Über Geschmack läßt sich ja angeblich bekanntlich nicht streiten, aber was hältst du hiervon:

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    void foo(int) { cout << "int" << endl; }
    void foo(void*) { cout << "void*" << endl; }
    
    int main() {
      foo(NULL);
    }
    

    Was wird ausgegeben?



  • Hmmm guter Punkt, Bashar, aber irgendwie doch nicht so gut, denn ich denke er beruht auf einem Misverständnis. Du hast optisch beim Lesen des Programms den Unterschied zwischen int und zeiger. Ich glaube das war RHBaums Aussage im Wesentlichen.

    Ich persönlich benutze auch lieber NULL eben genau aus Dokumentationszwecken. Das Auge findet diese Zeichenkette schneller als ein simples 0.

    Und falls hier irgendwer mit Stroustrup ausholen will, so möchte ich darauf hinweisen, dass Stroustrup irgend eine Abneigung gegen Präprozessoren hegt... Was auch die Abneigung gegen NULL erklärt. Unschön ist es zweifelsohne doch noch unschöner ist einfach ein 0 zuzuweisen. Die sauberste Lösung wäre ein C03 in dem ein Schlüsselwort "null" zum Sprachumfang gehört.

    -junix

    [ Dieser Beitrag wurde am 29.04.2003 um 12:56 Uhr von junix editiert. ]



  • Original erstellt von <NULL>:
    macht es eigentlich sinn NULL zu verwenden?
    zeiger sind doch entweder gültig oder nicht gültig. auf was sie dann zeigen ist doch egal. wenn sie ungültig sind, ist es egal ob 0 oder NULL oder 123456 drin steht. man darf sie nicht benutzen, da sie keine gültigen werte haben. und wenn ein zeiger gültig ist, dann ist es doch ebenso egal ob da 0 oder 123456 drin steht.

    an sich richtig.
    aber man verwendet der wert 0 genau, um zu sagen, daß da KEIN objekt drinne ist.
    völlig egal normalerweise. aber manchmal sinnvoll, z-B. hier:
    Person* findByName(string name);
    die funktion wird 0 zurückgeben, wenns in der tabelle keine person mit diesem namen gibt. hierzu isses einfach pracktisch, zu wissen, daß bei 0 kein objekt liegt. würde bei 0 eins liegen können, wüßt ich nicht sicher, ob da nun ne person mit diesem namen liegt oder ob es keine gab.

    ebenso bei verketteten strukturen. zum beispiel kennzeichne ich bei ner verketteten liste das letzte element damit, daß sein nachfolger 0 ist. das macht sowas:
    struct Node
    {
    T data;
    Node* next;
    };
    und
    for(Node* p=first;p!=0;p=p->next)
    cout<<p->data;

    wäre da nicht das tolle versprechen, daß bei 0 kein objekt liegt, müßte ich evtl teurer proggen.

    gäbe es in der sprache kein 0, würd ich mir eins bauen.
    int theNull;
    void* NULL=(void*)(&theNull);
    nur, weils so praktisch wäre, eine adresse zu kennen, wo kein objekt sein kann.

    da das jeder machen würde, kanns die sprache auch gleich mitbringen. und 0 hat nen dicken vorteil! es ist schneller. der vergleich auf 0 ist auf allen prozessoren, die ich kenne, schneller als ein vergleich gegen ne andere konstante. wenn also 0 im zeigerkontext auch noch ne binare repräsentation als 0 hat, dann bringts netten speed, und den sogar umsonst.


Anmelden zum Antworten