Hi allesamt,
NULL ist meistens als Makro wie folgt deklariert:
#define NULL ((void*)0)
In C: 7.17-3 "The macros (NULL,offsetof) are NULL which expands to an implementation defined null pointer constant ; and … Dto für NULL im C++ Standard (§C.2.2.3). Bei beiden wird der Wert nicht näher benannt. Insbesondere muss er nicht binär 0 sein.
In C++ ist aber zusätzlich auch definiert, dass „an integer constant expression with the value 0“ gecastet auf einen beliebigen Typ dann eine „null pointer constant of that type“ darstellt.
Eine wie auch immer geartete Konstante NULL muss in C++ mit normalen pointern wie auch mit pointer to members and pointer to member functions kompatibel sein, so dass sich in der Praxis der Wert „0“ (nicht (void*)0) für NULL ergibt.
Den feinen Unterschied sieht man z.B. hier
struct A {};
typedef int (A::\*p)(char\*);
int main()
{
p xx = 0; // erlaubt !!!
p yy = (void\*) 0; // nicht erlaubt !!
}
Wenn also NULL als „(void*)0“ in C++ definiert wäre, würde das zweite Assignment (p yy = NULL) fehlschlagen.
Die Notwendigkeit, hier NULL als 0 zu definieren, führt aber zu Mehrdeutigkeiten, wenn man Funktionen
void f(int a)
{
}
void f(char\* a)
{
}
vereinbart und dann f(NULL); aufruft.
Damit dieses „Chaos“ in Zukunft vermieden wird, gibt es ab dem neuen C++x09 Standard das nullptr keyword, das eine richtige null pointer constant ist.
Gruss
norsemanna