这个问题已经在这里有一个答案:
- 是什么“\ 0”和0 NULL之间的差异, 11解答
正如在问题中提到,我已经用NULL和假(在C ++)中可互换使用0或0x0和等。 我很好奇,想知道他们是否持有比是0同义词以外的任何特殊含义。
这个问题已经在这里有一个答案:
正如在问题中提到,我已经用NULL和假(在C ++)中可互换使用0或0x0和等。 我很好奇,想知道他们是否持有比是0同义词以外的任何特殊含义。
对一些平台NULL
不0x0
从是NULL在C语言所需/定义为零? :
NULL
保证是零,也许铸造到(void *)
1。
C99,§6.3.2.3,¶3
用的值的整数常量表达式
0
,或这样的转换为键入一个表达式void *
,被称为空指针常数。(55)如果一个空指针常数转换为指针类型,所得到的指针,被称为一个空指针,被保证比较不等的指针的任何对象或功能。
并注意55说:
55)宏NULL中定义
<stddef.h>
和其它标题)作为一个空指针常数。
请注意,因为如何对空指针的规则制定,使用分配/比较空指针的值保证是零,但实际上存储在里面的指针的位模式可以是任何其他东西(但据我所知只有少数极深奥的平台,利用这个事实,这不应该是一个问题,因为无论如何,以“看到”你应该去到下面的位模式UB -land反正)。
所以,至于标准而言,这两种形式是等价的( !ptr
相当于ptr==0
由于§6.5.3.3¶5和ptr==0
相当于ptr==NULL
); if(!ptr)
也相当地道。
话虽这么说,我平时写明确if(ptr==NULL)
而不是if(!ptr)
使之额外清楚,我检查无效,而不是一些布尔值的指针。
void *
投可以不存在由于严格的隐式转换规则,会做出这样的使用NULL
繁琐(你必须明确地将其转换为每次比较指针的类型)。 那么,NULL可能不是零,它只是一般为。 这取决于你的平台上-这里有一些讨厌的例子非零空机。
NULL已经得到了广泛的含义中三分球。 最有可能宣布为NULL指针的东西,不能被引用,但只是可分配的东西。 而0或为0x0可以是可被两个参考和指定的指针的值。
一般来说,在C++
,你不应该使用NULL
。 在C
, NULL
是一个宏(void*)0
,而在C++
,你应该使用0
,而不是NULL
。 但你不能使用false
,而不是0
的三分球! 除此之外,其实都是一样的,有时会造成混乱。
这就是为什么在C++11
一个nullptr
被定义为使用为指针。
在C和历史性C ++, NULL
必须是一个零值的整数常数,典型地0
。 我认为C可以包括一个明确铸造到void*
,但C ++不能因为这种语言不允许从隐式转换void*
到其他指针类型。
在现代C ++中,它可以是nullptr
代替。
在两种情况下,任何零值的整数常数(包括古怪诸如'\0'
和false
)可转化为空指针值。
从linux内核STDDEF.H
#define NULL ((void *)0)
enum {
false = 0,
true = 1
};
因此,它不完全是false
尽管这个帖子声称它是NULL
, 0x0
和false
几乎是相同的。