C++ 在C和C+中为NULL/false+;任何超过0x0/0b0/'\0';/0

C++ 在C和C+中为NULL/false+;任何超过0x0/0b0/'\0';/0,c++,c,null,C++,C,Null,正如问题中提到的,我一直在使用NULL和false(在C++中)与0或0x0互换,以此类推。我很好奇,除了作为0的同义词之外,它们是否还有什么特殊的含义。对于某些平台而言NULL不是0x0 发件人: NULL保证为零,可能被强制转换为(void*)1 C99,§6.3.2.3,^3 值为0的整型常量表达式,或转换为type的此类表达式 void*,称为空指针常量。(55)如果将空指针常量转换为 指针类型,结果指针称为空指针,保证比较不相等 指向任何对象或函数的指针 注55说: 55)宏NULL

正如问题中提到的,我一直在使用NULL和false(在C++中)与0或0x0互换,以此类推。我很好奇,除了作为0的同义词之外,它们是否还有什么特殊的含义。

对于某些平台而言
NULL
不是
0x0


发件人:

NULL
保证为零,可能被强制转换为
(void*)
1

C99,§6.3.2.3,^3

值为
0
的整型常量表达式,或转换为type的此类表达式
void*
,称为空指针常量。(55)如果将空指针常量转换为 指针类型,结果指针称为空指针,保证比较不相等 指向任何对象或函数的指针

注55说:

55)宏NULL在
(和其他标题)中定义为NULL指针常量

请注意,由于空指针的规则是如何制定的,用于分配/比较空指针的值保证为零,但实际上存储在指针内的位模式可以是任何其他东西(但是,只有少数非常深奥的平台利用了这一事实,而且这无论如何都不应该是问题,因为要“查看”您应该进入的底层位模式(无论如何都是-land)


因此,就本标准而言,这两种形式是等效的(
!ptr
由于§6.5.3.3 5,相当于
ptr==0
,而
ptr==0
相当于
ptr==NULL
if(!ptr)
也非常惯用

这就是说,我通常显式地编写
if(ptr==NULL)
而不是
if(!ptr)
,以更清楚地表明我正在检查指针的空值,而不是布尔值


<> LI>注意,C++中的 Value*/Cux> CAST不能被使用,因为更严格的隐式规则将使得使用此类代码> NUL/<代码>繁琐(您必须每次显式将其转换为比较指针的类型)。
空值可能不是零,只是通常是。这取决于您的平台-这里有一些非零空机器。

通常在
C++
中,您不应该使用
NULL
。在
C
中,
NULL
(void*)0
的宏,而在
C++
中,应该使用
0
而不是
NULL
。但是你不能用
false
代替
0
作为指针!除此之外,它们实际上是相同的,有时会引起混淆。

这就是为什么在
C++11
nullptr
被定义为用于指针。

NULL在指针中有广泛的含义。声明为NULL的指针很可能是不能被引用但可以被分配的指针。而0或0x0可以是指针的值,指针可以被引用和分配。

来自linux内核

所以它不完全是false


即使POST声称是代码> null <代码>,0x0和Falue几乎相同。C和历史C++中的

< P> >代码> null < /C> >必须是零值整数常量,通常是代码> 0 。我认为C可以包含一个显式的转换到Value*/Cuff>,但是C++不能,因为该语言不允许从Vult*/Cux>隐式转换为其他指针类型。 <>在现代C++中,它可以是<代码> nulLPTR < /代码>。
在任何一种情况下,任何零值整型常量(包括诸如
'\0'
false
)都可以转换为空指针值。

所以您做了类似
int*x=false
?空指针是指向内存位置的指针,通常为0x00,尽管我认为这取决于平台。“真”和“假”通常只是在C++中定义为1和0值。@奥斯丁:实际上,<代码> null <代码>只是一个积分常量表达式,其值为“代码>0”/代码>。类似于空指针的地址可能没有数值为零;但零值整型常量仍将转换为空指针。@LuchianGrigore是的,你说得对!谢谢您通过
char*
查看指针并读取其字节,您可以很好地看到底层位。这些字节和位是什么。
#define NULL ((void *)0)

enum {
        false   = 0,
        true    = 1
};