我正在回答一个问题,并评论到,多亏了名为metal的另一位发帖人,C++编译器允许这样做:
int *p = 0;
,但不允许这样做:int *p = 1
。是否认为0
是一个特殊的数字?
编辑:@DavidHefferman说在指针的上下文中,0是特殊的吗?是的。
- 为什么?
我正在回答一个问题,并评论到,多亏了名为metal的另一位发帖人,C++编译器允许这样做:
int *p = 0;
,但不允许这样做:int *p = 1
。是否认为0
是一个特殊的数字?
编辑:@DavidHefferman说在指针的上下文中,0是特殊的吗?是的。
- 为什么?
0
是一个特殊值。int i=0; int *p=i;
的东西将不会起作用,因为i
不是一个常量表达式(即使从阅读它时很明显它将始终包含值0)。 - undefinedreinterpret_cast
来强制转换。但即使如此,转换的结果可能与将空指针常量转换得到的结果不同。 - undefined0表示空,而1表示无效地址。
空指针常量是一个整数常量表达式,其求值结果为零(例如0或0L)。
"0
是一个空指针常量,因此可以直接赋值给指针而无需显式类型转换。 - user308323
int* p = (int*)1;
。这将把1
赋值给int* p
。0
不需要类型,而其他所有值都需要。这就是它的特殊之处。 - undefinedint *p = 0;
是被定义和有用的,并且总是有效的,而int *p = (int *)1;
最多只能说是实现定义(我不确定,它可能也是未定义行为),几乎总是无用的,几乎总是完全错误的。 - user3957600
作为空指针常量。C++对此进行了规范化,但限制了只能将整数常量评估为0,并且C的标准委员会采纳了C++的规范化(并增加了一个额外的合法可能性)。 - undefined0
是int
类型的。总是如此。但是C++,就像C一样,有很多隐式转换。这个特别之处在于它只适用于“求值为0的整数表达式”。(注意,NULL
可以定义为(1-1)
,虽然我从未见过。而且很长时间以来,g++将其定义为__builtin__nullptr
,或类似的编译器特定的整数表达式,它可以识别并生成警告,如果它不立即被转换为指针类型的话。) - undefined