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

C++ 为什么是C++;编译器允许将0分配给指针,而不分配其他数字,c++,compiler-construction,C++,Compiler Construction,我在发布一个问题的答案——我突然想到了这个问题,这要感谢另一张名为metal的海报 C++编译器允许这样做: int*p=0但不是这个int*p=1。0是否被视为特殊编号 编辑:@DavidHefferman说0特别吗?在指针的上下文中,是的。-为什么?0为空,而1为无效地址。空指针常量是计算结果为零(如0或0L)的整型常量表达式 参见本标准第4.10节,指针转换[conv.ptr]说明: 空指针常量是一个整数类型的整数常量表达式(5.19),其计算结果为零 或std::nullptr\t类型的

我在发布一个问题的答案——我突然想到了这个问题,这要感谢另一张名为metal的海报

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

int*p=0但不是这个
int*p=1
0
是否被视为特殊编号


编辑:@DavidHefferman说
0特别吗?在指针的上下文中,是的。
-为什么?

0为空,而1为无效地址。

空指针常量是计算结果为零(如0或0L)的整型常量表达式


参见本标准第4.10节,指针转换[conv.ptr]说明:

空指针常量是一个整数类型的整数常量表达式(5.19),其计算结果为零 或std::nullptr\t类型的prvalue。空指针常量可以转换为指针类型;结果 是该类型的空指针值,可与指向对象或 指向函数类型的指针。这种转换称为空指针转换。的两个空指针值 同一类型应比较相同。空指针常量到cv限定类型指针的转换为 一次转换,而不是指针转换后再进行限定转换的顺序(4.4)。 整数类型的空指针常量可以转换为std::nullptr\t类型的prvalue


因此,是的,
0
是指针上下文中的一个特殊值。

0是特殊值吗?在指针的上下文中,是的。0是null指针常量的另一种表示形式。@StarPilot这不是全部<代码>int*p=0
是定义的、有用的并且总是有效的,而
int*p=(int*)1充其量是实现定义的(我不确定,它也可能是UB),几乎总是无用的,几乎总是完全错误的。最后,唯一真正的答案是:因为标准这么说。历史上,C的发明者忘记提供空指针。最初的实现允许将int隐式转换为指针,因此人们习惯于使用
0
表示空指针常量。C++将其形式化,但将其限制为积分常数,计算为0,C的标准委员会采用C++形式化(但增加了附加的法律可能性)。@星际飞行员编号<代码> 0 < /Cord>具有类型<代码> int <代码>。总是。但是C++,和C一样,有很多隐式转换。这个函数很特殊,因为它只适用于“计算为0的积分表达式”。(请注意,
NULL
可以定义为
(1-1)
,尽管我从未见过它。很长一段时间以来,g++将其定义为
\uuuuuuuunullptr
,或者类似的东西——一个编译器特定的整数表达式,它可以识别,如果它没有立即转换为指针类型,则会生成警告。)例如,数字
0
是一个空指针常量,因此可以分配给指针,而无需显式类型转换。^ 6分钟后接受答案注意,该常量表达式很重要--例如,类似
int i=0;int*p=i
将不起作用,因为
i
不是一个常量表达式(尽管从阅读中很明显,它总是包含值0)。@JerryCoffin当然,您可以通过
重新解释它。但即使如此,转换的结果也可能不同于空指针常量转换的结果。