Neither in C nor in C++ null-pointer value is in any way tied to physical address 0
. The fact that you use constant 0
in the source code to set a pointer to null-pointer value is nothing more than just a piece of syntactic sugar. The compiler is required to translate it into the actual physical address used as null-pointer value on the specific platform.
In other words, 0
in the source code has no physical importance whatsoever. It could have been 42
or 13
, for example. I.e. the language authors, if they so pleased, could have made it so that you'd have to do p = 42
in order to set the pointer p
to null-pointer value. Again, this does not mean that the physical address 42
would have to be reserved for null pointers. The compiler would be required to translate source code p = 42
into machine code that would stuff the actual physical null-pointer value (0x0000
or 0xBAAD
) into the pointer p
. That's exactly how it is now with constant 0
.
Also note, that neither C nor C++ provides a strictly defined feature that would allow you to assign a specific physical address to a pointer. So your question about "how one would assign 0 address to a pointer" formally has no answer. You simply can't assign a specific address to a pointer in C/C++. However, in the realm of implementation-defined features, the explicit integer-to-pointer conversion is intended to have that effect. So, you'd do it as follows
uintptr_t address = 0;
void *p = (void *) address;
Note, that this is not the same as doing
void *p = 0;
The latter always produces the null-pointer value, while the former in general case does not. The former will normally produce a pointer to physical address 0
, which might or might not be the null-pointer value on the given platform.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…