C++ 在C和C+中为NULL/false+;任何超过0x0/0b0/'\0';/0
正如问题中提到的,我一直在使用NULL和false(在C++中)与0或0x0互换,以此类推。我很好奇,除了作为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
不是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++中的
空值可能不是零,只是通常是。这取决于您的平台-这里有一些非零空机器。通常在
C++
中,您不应该使用NULL
。在C
中,NULL
是(void*)0
的宏,而在C++
中,应该使用0
而不是NULL
。但是你不能用false
代替0
作为指针!除此之外,它们实际上是相同的,有时会引起混淆。这就是为什么在
C++11
中nullptr
被定义为用于指针。NULL在指针中有广泛的含义。声明为NULL的指针很可能是不能被引用但可以被分配的指针。而0或0x0可以是指针的值,指针可以被引用和分配。来自linux内核
所以它不完全是false
即使POST声称是代码> null <代码>,
在任何一种情况下,任何零值整型常量(包括诸如
'\0'
和false
)都可以转换为空指针值。所以您做了类似int*x=false
?空指针是指向内存位置的指针,通常为0x00,尽管我认为这取决于平台。“真”和“假”通常只是在C++中定义为1和0值。@奥斯丁:实际上,<代码> null <代码>只是一个积分常量表达式,其值为“代码>0”/代码>。类似于空指针的地址可能没有数值为零;但零值整型常量仍将转换为空指针。@LuchianGrigore是的,你说得对!谢谢您通过char*
查看指针并读取其字节,您可以很好地看到底层位。这些字节和位是什么。
#define NULL ((void *)0)
enum {
false = 0,
true = 1
};