为什么 C++ 编译器允许将 0 分配给指针而不允许其他数字

Ani*_*nge 3 c++ compiler-construction

我正在发布一个问题的答案 - 并评论了我想到的,感谢另一张名为金属的海报

C++ 编译器允许这样做:

int *p = 0;但不是这个int *p = 1。是否被0视为特殊号码?

编辑:@DavidHefferman 说Is 0 special? In the context of a pointer, yes it is.- 为什么?

Dav*_*nan 6

标准第 4.10 节“指针转换”[conv.ptr] 说:

空指针常量是计算结果为零的整数类型的整型常量表达式 (5.19) 纯右值或 std::nullptr_t 类型的纯右值。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与指向对象的指针或指向函数类型的指针的所有其他值区分开。这种转换称为空指针转换。相同类型的两个空指针值比较相等。空指针常量到 cv 限定类型指针的转换是单个转换,而不是指针转换后跟限定转换的序列 (4.4)。整型的空指针常量可以转换为 std::nullptr_t 类型的纯右值。

所以,是的,0它是指针上下文中的一个特殊值。

  • 但请注意,*constant* 表达式很重要——例如,类似 `int i=0; 的东西。int *p=i;` 不会起作用,因为 `i` 不是一个常量表达式(尽管从阅读它中可以明显看出它总是包含值 0)。 (3认同)