c++ - 指针是否可能指向地址 0x000000

标签 c++ pointers

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

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

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

if(pointerToObject != NULL)

会返回 false 吗?

最佳答案

不,您不能获得一个有效的(=非空)指针 p,对于它 p != NULL 返回 false

但是请注意,这并不意味着任何关于“地址 0”的内容(无论它是什么意思)。当提到地址和指针时,C++ 有意非常抽象。有一个空指针值,即不指向任何地方的指针值。创建这种指针的方法是将一个空指针常量赋给一个指针变量。在 C++03 中,空指针常量是字面量 0,可选择带有后缀(例如 0L)。 C++11 添加了另一个空指针常量,字面量 nullptr

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

int *p = 0;

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

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


另一种看待这个问题的方式是下面的声明是等价的:

int *p = 0;
int *q = reinterpret_cast<int*>(0);

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

关于c++ - 指针是否可能指向地址 0x000000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25934896/

相关文章:

c++ - 重载构造函数的 Unresolved external symbol 错误

c++ - 是否可以在可移植 C++03 代码中散列指针?

c++ - 检查指针是否为 NULL 并导致运行时错误

c++ - 套接字接收()函数

c++ - printf 与 std::cout

c++ - 将对象的成员定义为值、指针或引用有什么区别

ios - 修改常量值

c++ - 使用非指针数据成员 move 语义

c++ - QUdpSocket 绑定(bind)失败

c++ - 这个char数组代码有什么问题?