我能保证nullptr的地址始终为0吗?

cat*_*our 1 c++ nullptr c++11

我知道NULL总是如此0,但是为什么下面的代码会打印该消息?

#include <iostream>

using namespace std;

int main() {
    int* ptr = nullptr;
    if (ptr == 0) {
        cout << "Does it always work?";
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ast*_*ngs 5

是的。

初始化的指针nullptr是空指针。

将空指针与文字0(或与 a std::nullptr_t,即nullptr;它们一起称为空指针常量)进行比较true,始终会产生 。

不过,你不能用任何旧的表达式来做到这一点;即使整数i为 1,i-i也不是有效的空指针常量,尽管在运行时评估为 0。如果您尝试这样做,您的程序将无法编译。只有文字 0才是可以与指针进行比较的有效空指针常量。

而且,这并不一定意味着它的所有位都为零!就像将 a 转换boolint0 或 1 一样,但 a 的实际底层位bool可以是实现喜欢的任何内容。

最后,请注意您的术语略有偏差;per[support.types.nullptr/1]本身nullptr没有可取的地址

  • @catfour 编译器将 `std::fill` 调用分派给 `memset` 调用(如果可能的话)(即对于普通可复制类型):https://godbolt.org/z/q8-qMF `std::fill 的好处` 的优点是它适用于*每种*类型,而不仅仅是可简单复制的类型,并且是类型安全的。性能通常不是使用“memset”的充分理由。 (2认同)