NULL
-
((void *)0)
warum ist NULL in C so definiert und in C++ nur als 0? wozu (void*) in C??danke
-
^^weiss ich auch nicht, ist aber auch egal, weil's *int ptr=0; auch tut, um 'nen pointer ungültig zu machen. also dieses 'NULL' ist eigentlich überflüssig (jedenfalls in C).
-
das NULL hat sich einfach so eingebürgert (erhöht die lesbarkeit). Warum das nach void* gecastet wird weiss ich auch nicht.
-
0 ist in c ein Integer literal
durch das casten wird dieser integer literal
zu einer adresse von type void pointerund da bei c einen void pointer impliziet zu jeden anderen pointertype
convertiert wird ist es allgemein und kann überall verwendet werdenvoid* 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.htmlc 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 infloat*
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 infloat*
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.