在C或C ++中,不是NULL只是常量整数0?如果它是一个常量整数,为什么我们允许指定一个指向值NULL的指针?编译器不会说两种类型不匹配吗?
答案 0 :(得分:4)
常量0
的解释取决于上下文。如果它在需要数字的上下文中使用,则数字为零。如果它在需要指针的上下文中使用,则将其视为空指针。所以如果你有代码:
int n = 0; // assigns zero
int *p = 0; // assigns null pointer
somefunc((char *)0); // passes null pointer to the function
在C中,宏NULL
被允许扩展为整数常量0
或这样的常量强制转换为void *
。在C ++ pre-11中,它可以扩展为整数常量,其值为0
。在C ++ - 11中,它可以扩展为值为0
的整数文字或类型为std::nullptr_t
的prvalue(例如nullptr
)。
有关C ++描述,请参阅http://en.cppreference.com/w/cpp/types/NULL,有关C描述,请参阅http://en.cppreference.com/w/c/types/NULL。
答案 1 :(得分:2)
有两个问题:
类型可以具有"特殊",带外特殊值。例如,浮点数的值为NaN
。指针有一个特殊的,非有效指针值,空指针。
空指针的名称是什么?在C中,无论好坏,其名称为0
。 (如果它的名称是一个单独的关键字,如null
或nil
,它将避免各种混淆,但这不是语言定义的出现方式。)
但是,是的,你是对的,将常量0
分配给指针变量的能力是一种特殊情况,在语言定义中有所体现。
答案 2 :(得分:1)
6.3.2.3指针
...
3值为0的整型常量表达式或此类表达式转换为类型void *
,称为空指针常量。 66)如果为空指针将常量转换为指针类型,结果指针(称为空指针)保证与指向任何对象或函数的指针不相等。 66)宏NULL在< stddef.h>中定义。 (和其他标题)作为空指针常量;见7.19。
指针上下文中的文字0
由编译器专门处理,并且被理解为空指针常量。在源代码的上下文中,它的行为与任何其他零值表达式相同。
但是,一旦您的代码被转换为机器代码,所有出现的空指针常量将被替换为底层平台用来表示明确定义的无效指针值的任何值,无论是否为0
或0xFFFFFFFF
或0xDEADBEEF
。