指针是否可能指向0x000000的地址

Mur*_*aki 3 c++ pointers

这个毫无意义的问题是关于指针的,有人可以指出我正确的方向

变量的地址是否可以合法地分配值0x000000,如果是这样,这是否意味着例如:

#define NULL 0x00000000
int example;
int * pointerToObject = &example;

if(pointerToObject != NULL)
Run Code Online (Sandbox Code Playgroud)

会返回虚假?

Rei*_*ica 10

不,你不能得到有效的(=非空)指针p为其p != NULL返回false.

但请注意,这并不意味着"地址0"(无论这意味着什么).在引用地址和指针时,C++是故意非常抽象的.有一个空指针值,即指向不指向任何位置的指针的值.创建这样一个指针的方法是将空指针常量赋给指针变量.在C++ 03中,空指针常量是文字0,可选地带有后缀(例如0L).C++ 11添加了另一个空指针常量,即文字nullptr.

如何在内部表示空指针值超出了C++语言的范围.在某些(大多数?)系统中,地址值0x00000000用于此,因为用户程序可以指向的任何内容都不能合法地驻留在该地址.但是,没有什么能阻止硬件平台使用该值0xDEADBEEF来表示空指针.在这样的平台上,这段代码:

int *p = 0;
Run Code Online (Sandbox Code Playgroud)

必须编译为将值分配给0xDEADBEEF变量占用的4个字节p.

在这样的平台上,你可以合法地获得一个指向地址的指针0x00000000,但它不会比较等于0,NULLnullptr.


另一种看待这种情况的方法是以下声明等同:

int *p = 0;
int *q = reinterpret_cast<int*>(0);
Run Code Online (Sandbox Code Playgroud)

p使用空指针值初始化.q用地址初始化0(reinterpret_cast当然,取决于使用的映射).