以下哪种方法是初始化变量的更正确方法?初始化变量和指针与NULL还是0有区别吗?
int x = 0;
int x = NULL;
指针怎么样?我被告知有关NULL
的不协调的事情,比如:“NULL
最适合初始化指针”或“不要使用NULL
而是0初始化变量”等等......现在,我在互联网上看到NULL
是平等的为0,我测试了自己。那么有什么意义呢?为什么有些人说使用NULL不是一个好选择?有什么我失踪了吗?
以下哪种方法是初始化变量的更正确方法?初始化变量和指针与NULL还是0有区别吗?
int x = 0;
int x = NULL;
指针怎么样?我被告知有关NULL
的不协调的事情,比如:“NULL
最适合初始化指针”或“不要使用NULL
而是0初始化变量”等等......现在,我在互联网上看到NULL
是平等的为0,我测试了自己。那么有什么意义呢?为什么有些人说使用NULL不是一个好选择?有什么我失踪了吗?
NULL
是一个指针常量。你用它来初始化一个指向一个值的指针,该值指向任何东西。
在大多数C实现,它被定义为:
#define NULL ((void *)0)
但有没有这样的保证。
也许这就是为什么很多人告诉我使用NULL不是一个好主意?这可以解释我的神秘感 –
@ClaudioCortese正确。在实践中,它们通常是相同的,但是如果您依赖于这种行为,然后将代码移到不存在的平台上,则会遇到各种问题。 – dbush
Mhh,好的,所以它更多的是与代码的可移植性有关的东西,对吧? –
NULL
是一个空指针常量。你应该使用它来初始化指针类型。
从C11
,章§7.19,stddef.h
NULL
,其扩展到一个实现定义空指针常量。
和在C 空指针恒定,章§6.3.2.3
与值
0
,或这样的转换为类型void *
表达的整数常量表达式,被称为空指针常量。[...]
所以,类型是指针的类型。
对于其他非指针变量,你应该使用0
背后有真正的原因还是只是个人偏好? –
@ClaudioCortese哪一个是个人喜好?类型很重要。也许大多数情况下,实现是_equivalent_,但它不是_same_。希望很清楚。 :) –
我的意思是,如果NULL == 0,为什么可以用NULL初始化指针,为什么它不好用NULL初始化变量? –
理论上NULL
可以是指向不同于0
的地址的指针。但实际上,这种定义会使大部分软件崩溃。在99.99%的情况下为0(或(void *)0
)。
有/部分架构部署NULL为而非零:Prime 50,Honeywell-Bull,CDC Cyber 180系列等。在这些情况下,NULL绝对不能与零互换。
有关受影响机器的详细信息,请参见this answer。
我们是在谈论空指针*常量*还是空指针*值*?就C而言,空指针常量是* always * zero-valued。 –
@JohnBode:是的,区分'NULL'(宏),_null pointer_和_null指针constant_总是个好主意。 – Olaf
重点:wallyk的回答是误导性的; NULL通常被定义为那些空指针不为0的巴洛克式旧机器上的0 * even * *的一些版本。参见C FAQ列表,问题5.5。 –
不要使用NULL
来初始化非指针类型,因为它可能会可能根据实现扩展到像(void *) 0
之类的东西。使用普通的0
(或宏或01限定变量,计算结果为普通0
)为整型。
以下哪种方法是更正确的初始化变量的方法?
// int x = NULL; `NULL` implies pointer
int x = 0; // 0 implies integer value and x is an integer.
怎么样的指针?
void *p = NULL; // `NULL` implies pointer and p is a pointer.
//void *p = 0; // 0 implies integer value
即NULL等于0
它是在值相等,但也许不是在比特模式。请参阅下面的+0.0, -0.0
示例。
如果NULL
等于0,总是那么就不会有需要它C.
NULL
是一个空指针辅音 - 它常常,但并不总是有零点模式。一个具有NULL
值的指针总是与0
的值相同:相同的值,不同的位模式。
请记住==
比较值,而不是位模式。
void *a = NULL;
if (a == NULL) Always_True();
if (a == 0) Always_True();
的例子,可能会有帮助。 +0.0
和-0.0
具有相同的值,相同的类型,但不同的位模式。指针可能会出现类似的情况。
int main(void) {
double pz = +0.0;
double nz = -0.0;
printf("=:%d bits:%d\n", pz == nz, memcmp(&pz, &nz, sizeof pz) == 0); // =:1 bits:0
return 0;
}
当你初始化(或比较)一个指针时,肯定使用NULL
;这是很好的风格。
绝对不要在使用整数时使用NULL;它很糟糕的风格(它可能无法正常工作)。
不要听任何人暗示你不应该使用带指针的NULL
;他们可能会感到困惑。
有关更多信息,请参阅C常见问题列表http://c-faq.com/null/index.html。
'NULL'不等于'0'。 –
此问题与[此其他问题]相关(http://stackoverflow.com/questions/9894013/is-null-always-zero-in-c) – Magix
http://stackoverflow.com/questions/8288482/is -null-in-c-required-defined-to-zero – bruceg