问题
So, I had an argument with my professor earlier defending that NULL is not a pointer, but he kept on insisting that it is because there is such a thing as NULL pointer. So, here I am now a little bit confused if NULL is really a pointer or not
I already tried search over the internet but couldn't find any answer, so my last resort is here
回答1:
In C, NULL
is a macro that expands to a null pointer constant.
7.19p3
The macros are
NULL which expands to an implementation-defined null pointer constant; ...
A null pointer constant is an integer constant expression with the value 0
(
e.g., 0
, 1-1
, 42*0LL
, etc.) or such an expression cast to (void*)
.
6.3.2.3p3
An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.66) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.
Most common C implementations define NULL
to be 0
, 0L
, or ((void*)0)
.
So you are correct. NULL
need not be a pointer.
(IIRC, C++ doesn't even allow the (void*)
cast in NULL
, meaning NULL
in C++ always has integer type. Because of that and because void*
pointers
do not compare with regular pointers so readily in C++, C++>=11 now has a special nullptr
keyword.)
回答2:
NULL
itself is not a pointer, it is a macro that can be used to initialize a pointer to the null pointer value of its type. When compared to a pointer, it compares equal if the pointer is a null pointer and unequal if the pointer is a valid pointer to an object of its type.
There is no semantic difference between char *p = 0;
and char *p = NULL;
but the latter is more explicit and using NULL
instead of 0
is more informative in circumstances where the other operand is not obviously a pointer or if comparing to an integer looks like a type mismatch:
FILE *fp = fopen("myfile", "r");
if (fp == NULL) {
/* report the error */
}
Similarly, there is no semantical difference in C between '\0'
and 0
, they both are int
constants. The first is the null byte, the second the null value. Using 0
, '\0'
and NULL
wisely may seem futile but makes code more readable by other programmers and oneself too.
The confusion may come from misspelling or mishearing the null pointer as the NULL
pointer. The C Standard was carefully proof read to only use null pointer and refer to NULL
only as the macro NULL
.
Note however that one the accepted definitions of NULL
, #define NULL ((void*)0)
makes NULL
a null pointer to void
.
回答3:
There's nothing about the idea of a 'pointer to address 0' that's a problem.
The rule is that you're disallowed from derefencing it... it's allowed to exist, and if created will meet any criteria for "pointerhood" I can think of. Just because it's not meaningfully a pointer to something...
来源:https://stackoverflow.com/questions/55520687/is-null-a-pointer