正如问题所述,我一直在使用NULL和false(在C ++中)与0或0x0交替使用,依此类推。我很想知道除了是0的同义词之外,它们是否具有任何特殊意义。
答案 0 :(得分:5)
对于某些平台NULL
不是0x0
来自Is NULL in C required/defined to be zero?:
NULL
保证为零,可能会投放到(void *)
1 。
C99,§6.3.2.3,¶3
具有值
0
的整型常量表达式,或者此类表达式转换为类型void *
,称为空指针常量。(55)如果将空指针常量转换为a 指针类型,结果指针,称为空指针,保证比较不等 指向任何对象或函数的指针。
并注意55:
55)宏NULL在
<stddef.h>
(和其他标题)中定义为空指针常量。
请注意,由于如何制定空指针的规则,用于分配/比较空指针的值保证为零,但实际存储在指针内的位模式可以是任何其他东西(但AFAIK)只有少数非常深奥的平台利用了这个事实,这不应该是一个问题,因为要“看到”你应该进入UB - 土地的基础位模式。
因此,就标准而言,这两种形式是等价的(!ptr
相当于ptr==0
,因为§6.5.3.3¶5,而ptr==0
相当于ptr==NULL
); if(!ptr)
也非常惯用。
话虽如此,我通常会明确地写if(ptr==NULL)
而不是if(!ptr)
,以使我更清楚地知道我正在检查指针是否为无效而不是某个布尔值。
void *
强制转换不能出现,因为更严格的隐式强制转换规则会使这种NULL
的使用变得繁琐(您必须将其显式转换为比较指针的类型)每一次)。答案 1 :(得分:3)
嗯,NULL可能不是零,它通常是。它取决于您的平台 - 这里有一些非零examples非零NULL机器。
答案 2 :(得分:1)
通常在C++
中,您不应使用NULL
。在C
中,NULL
是(void*)0
的宏,而在C++
中,您应该使用0
代替NULL
。但是你不能使用false
而不是0
作为指针!除此之外,它们实际上是相同的,有时会造成混乱
这就是为什么在C++11
中nullptr
被定义为用于指针的原因。
答案 3 :(得分:1)
NULL在指针中有广泛的意义。很可能一个声明为NULL的指针是无法引用的东西,但只能分配一些东西。而0或0x0可以是指针的值,可以引用和分配。
答案 4 :(得分:0)
来自linux内核stddef.h
#define NULL ((void *)0)
enum {
false = 0,
true = 1
};
所以它不完全是false
即使this发布声明为NULL
,0x0
和false
几乎相同。
答案 5 :(得分:0)
在C和历史C ++中,NULL
必须是零值整数常量,通常为0
。我认为C可以包含对void*
的显式强制转换,但C ++不能,因为该语言不允许从void*
到其他指针类型的隐式转换。
在现代C ++中,它可以是nullptr
而不是。
在任何一种情况下,任何零值整数常量(包括诸如'\0'
和false
之类的奇数)都可以转换为空指针值。