Pointer und Adresse 0
-
int *pVal = NULL; int *pVal = 0;Besteht hier ein Unterschied? was ich weiss ist NULL ein Macro...
macht es überhaupt sinn wenn man einen Pointer deklariert und auf
Adresse 0 zeigen lässt?
-
Besteht hier ein Unterschied?
Nein.
was ich weiss ist NULL ein Macro...
Korrekt. Das z.B. als 0 oder 0L definiert ist.
macht es überhaupt sinn wenn man einen Pointer deklariert und auf
Adresse 0 zeigen lässt?Natürlich. Variablen sollten niemals unintialisiert sein. In der Regel kann man sagen, dass wann immer ein Pointer nicht auf ein gültiges Objekt zeigt er ein Nullzeiger sein sollte.
-
Heutzutage verwendet man:
int *pVal = 0;Das dient dazu anzuzeigen das der Pointer noch keinen gültigen Wert zugewiesen
bekommen hat. Da du ja jede Variable initialisieren solltest, weist du einem
Zeigerhalt entweder den gewünschten Wert oder alternativ 0 zu.
-
Aus welchem Grund sollte man 0 anstelle von NULL verwenden?
Ich sehe da gerade nur Nachteile:
-NULL sticht einem mehr ins Auge als eine 0
-Wenn ich NULL verwende und mich einschränke beim Programmieren kann ich es danach auch als C Programm kompilierenSo ne NULL Klasse wie sie Scott Meyers in Effective C++ vorstellt finde ich ne super Sache

-
HumeSikkins schrieb:
was ich weiss ist NULL ein Macro...
Korrekt. Das z.B. als 0 oder 0L definiert ist.
oft auch als '(void*)0'
-
net schrieb:
HumeSikkins schrieb:
was ich weiss ist NULL ein Macro...
Korrekt. Das z.B. als 0 oder 0L definiert ist.
oft auch als '(void*)0'
wir sind doch hier im c++ forum...
-
standar.t c++'ler schrieb:
oft auch als '(void*)0'
wir sind doch hier im c++ forum...
[/quote]
mist, das passiert mir jedes mal
-
net schrieb:
HumeSikkins schrieb:
was ich weiss ist NULL ein Macro...
Korrekt. Das z.B. als 0 oder 0L definiert ist.
oft auch als '(void*)0'
Komisch. Ich wusste das diese in Standard-C++ ungültige Definition natürlich wieder von irgendjemanden eingeworfen wird (hauptsache man hat was geschrieben), konnte mich aber dennoch nicht dazu überwinden gleich von vornerein auf die Ungültigkeit dieser Definition hinzuweisen

Aus welchem Grund sollte man 0 anstelle von NULL verwenden?
Letztlich ist das Geschmacksache. Wer guten Geschmack hat verwendet 0, alle anderen NULL

Im Ernst: NULL kann nichts, was 0 nicht auch kann. NULL suggeriert auf der anderen Seite vielleicht mehr als es wirklich ist.void func(int); void func(char*); void g() { func(0); func(NULL); }Hier wird keinesfalls func(char*) aufgerufen, auch wenn der ein oder andere das bei func(NULL) annehmen könnte.
Letztlich ist es aber wie gesagt Geschmacksache.
-
HumeSikkins schrieb:
Komisch. Ich wusste das diese in Standard-C++ ungültige Definition natürlich wieder von irgendjemanden eingeworfen wird
und warum ist das ungültig? ist doch auch bloss 'ne 0
-
Gibt es denn überhaupt ne Möglichkeit die char* Variante aufzurufen mit nem Nullzeiger?
Mir fällt da gerade nur char* p( NULL ); func( p ); ein, oder den Programmierer verantwortlichen Programmierer auf Kaffeeentzug zu setzen
-
net schrieb:
HumeSikkins schrieb:
Komisch. Ich wusste das diese in Standard-C++ ungültige Definition natürlich wieder von irgendjemanden eingeworfen wird
und warum ist das ungültig? ist doch auch bloss 'ne 0
Nö. 0 ist eine Nullpointer-Konstante, die im entsprechenden Kontext implizit in einen Nullpointer passenden Typs konvertiert werden kann. (void*)0 hingegen hat bereits den Typ void* und kann damit z.B. nicht als Initialisierung für einen int* benutzt werden. In C++ gibt es keine implizite Konvertierung zwischen void* -> ptr*.
Gibt es denn überhaupt ne Möglichkeit die char* Variante aufzurufen mit nem Nullzeiger?
Klar:
func(static_cast<char*>(0));
-
Naja, so könnte man es machen:
func( (char*)0 );
Meiner Meinung nach sollte sauberer Code nach Möglichkeit ohne Makros auskommen, und wenn man sich überlegt, dass irgendwo im Code ein "#define NULL 0" steht, nur damit man "int *i = NULL" schreiben kann, dann finde ich das ein wenig über.
Wofür auch? "0" sagt ja schon alles aus.
Außerdem ist es imo wesentlich übersichtlicher und schöner, wenn ich z.B. bei einer größeren Funktion schreiben:
func(0, 0, 0, 0, "Test"); // als func(NULL, NULL, NULL, NULL, "Test");Aber das ist wohl auch nur Geschmackssache.

-
User-- schrieb:
Gibt es denn überhaupt ne Möglichkeit die char* Variante aufzurufen mit nem Nullzeiger?
Ja, indem du zB eine Nullzeiger Klasse verwendest.
mantiz schrieb:
Außerdem ist es imo wesentlich übersichtlicher und schöner, wenn ich z.B. bei einer größeren Funktion schreiben:
func(0, 0, 0, 0, "Test"); // als func(NULL, NULL, NULL, NULL, "Test");Aber das ist wohl auch nur Geschmackssache.

Deine erste Funktion sagt mir, ich hab 4 ints und 'nen String. Von Zeiger ist da nichts zu sehen, deshalb kann man auf den ersten Blick auch nicht auf Nullzeiger schliessen. Deshalb find ich sowas überhaupt nicht schön. Und übersichtlicher auch nicht.
-
Naja, genauso kann der letzte Parameter ein "char*" oder "const char*" oder so sein, das sehe ich so sowieso nicht. Aber wenn ich die Maus über die Funktion halte, dann wird mir der Prototyp angezeigt und ich weiß wofür die Parameter stehen.
Ich würde nicht versuchen vom Namen der Variablen/Konstanten etc. beim Funktionsaufruf auf den Prototypen zu schließen, das könnte u.U. ziemlich schief gehen, aber wie gesagt, ist wohl Geschmackssache.

-
Hallo,
eine Funktion die man mit vier Nullpointern aufrufen kann ist ein Beispiel für ein schlechtes Interface. Da hilft auch kein NULL drüber hinweg.
Allein schon, weil weder NULL noch 0 eine Bedeutung verraten. Wenn ich also schon so eine Funktion habe, bleibt aus Sicht der Lesbarkeit imo sowieso nicht viel außer:func(0, // no Foo... 0, // no Bar... 0, // neither a humpty... 0, // nor a dumpty "Test");Besser wäre es natürlich, wenn man ein hübscheres Interface baut. Z.B. mittels Überladung.
-
War ja auch nur ein Beispiel ... *grml*

Wieso werden meine Beispiele immer so runtergemacht.
*schnief* *von-der-brücke-spring*Aber hast natürlich Recht, wenn ich an meinen WinAPI-Wrapper denke, dann hab' ich da z.B. sowas:
class Window { public: Window(std::string Text = "") { this->Create(0, Text); } Window(std::string Text = "", int x, int y) { this->Create(0, Text, x, y); } ... protected: Create(Widget* Parent, std::string Text, int x = CW_USEDEFAULT, int y = CW_USEDEFAULT, int width = CW_USEDEFAULT, int height = CW_USEDEFAULT) { ... } ... };Tut nichts zur Sache, wollte nur klarstellen, dass ich Funktionen/Methoden ebenfalls vermeide, wo man u.U. 4 oder mehr Nullpointer übergeben muss, das ist irgendwie zu Microsoft-lastig.

-
Ich geb lieber 10Parameter an, als ne Struktur anzulegen, auszufüllen und ner Funktion zu übergeben nur damit man nen kurzen Funktionsaufruf hat.
-
Wenn man 10 Funktionsparameter in C++ hat, dann nehme ich an hat man bei der Objektorientierten Programmierung auf ganzer Linie versagt.