我知道NULL == (void *)0
,但提到它可以表示为不包含全零的值。困扰我的是,如果这些代码片段对于所有(any_type *)
:
any_type *val;
if (val) { ... };
和
if (val != NULL) { ... };
答案 0 :(得分:10)
是。您可以通过这种方式使用宏NULL
。它是一个空指针常量,等于0
。
当C需要表达式的布尔值时,当表达式比较等于零时推断出false值,否则推断为true值。也就是说,每当写一次
if(expr)
其中
一样expr
是任何表达式,编译器本质上就像它被写成if((expr) != 0)
用
p
代替普通指针表达式expr
,我们有if(p) is equivalent to if(p != 0)
这是一个比较上下文,因此编译器可以告诉(隐式)
0
实际上是一个空指针常量,并使用正确的空指针值。这里没有任何诡计;编译器以这种方式工作,并为两个构造生成相同的代码。 空指针的内部表示无关紧要。
但提到它可以表示为不包含全零的值。
是。真正。但在这种情况下representation doesn't matter:
每当程序员通过编写
0
或NULL
,来请求空指针时,编译器负责生成机器用于该空指针的任何位模式强>