如问题中所述,我一直在使用 NULL 和 false(在 C++ 中)与 0 或 0x0 等互换。我很想知道它们是否具有除 0 的同义词之外的任何特殊含义。
6 回答
对于某些平台NULL
不是0x0
NULL
保证为零,也许被强制转换为(void *)
1。
C99,§6.3.2.3,¶3
具有 value 的整数常量表达式
0
,或转换为 type 的表达式void *
称为空指针常量。(55) 如果将空指针常量转换为指针类型,则生成的指针(称为空指针)保证比较不等于指向任何对象或函数的指针。
注释 55 说:
55) 宏 NULL 在
<stddef.h>
(和其他头文件)中定义为空指针常量。
请注意,由于空指针规则的制定方式,您用于分配/比较空指针的值保证为零,但实际存储在指针内的位模式可以是任何其他东西(但 AFAIK 只有少数非常深奥的平台利用了这个事实,无论如何这应该不是问题,因为要“看到”底层位模式,无论如何你都应该进入UB -land )。
因此,就标准而言,这两种形式是等价的(!ptr
由于ptr==0
§6.5.3.3 ¶5 等价于,并且ptr==0
等价于ptr==NULL
);if(!ptr)
也很地道。
话虽如此,我通常明确地写if(ptr==NULL)
而不是if(!ptr)
更清楚地表明我正在检查指针是否为空,而不是一些布尔值。
- 请注意,在 C++ 中
void *
,由于更严格的隐式转换规则会使这种类型的使用NULL
变得繁琐(您每次都必须将其显式转换为比较指针的类型),因此不能存在转换。
好吧,NULL 可能不是零,它通常是。它取决于您的平台——这里有一些非零 NULL 机器的讨厌的例子。
一般来说,C++
你不应该使用NULL
. In C
,NULL
是 的宏(void*)0
,而 inC++
你应该使用0
而不是NULL
. 但是你不能使用false
代替0
指针!除此之外,它们实际上是相同的,有时会引起混淆。
这就是为什么 in C++11
anullptr
被定义为用于指针。
NULL 在指针中具有广泛的意义。最有可能声明为 NULL 的指针是不能被引用但可以被分配的东西。而 0 或 0x0 可以是可以引用和分配的指针的值。
在 C 和历史 C++ 中,NULL
必须是一个零值整数常量,通常是0
. 我认为 C 可以包含显式转换为void*
,但 C++ 不能,因为该语言不允许从void*
其他指针类型进行隐式转换。
在现代 C++ 中,它可以是任何一个nullptr
。
在任何一种情况下,任何零值整数常量(包括 和 等奇数'\0'
)false
都可以转换为空指针值。