在这个问题中,初始化器用于将指针设置为空。而不是使用 value of 的0
值0L
。我读过应该完全0
使用空指针,因为确切的空指针表示是特定于实现的。
移植时可以使用0L
将指针设置为 null 导致问题吗?
在这个问题中,初始化器用于将指针设置为空。而不是使用 value of 的0
值0L
。我读过应该完全0
使用空指针,因为确切的空指针表示是特定于实现的。
移植时可以使用0L
将指针设置为 null 导致问题吗?
从标准(4.10.1):
空指针常量是整数类型的整数常量表达式 (5.19) 右值,其计算结果为零
所以我想没0L
问题。
我认为0L
这很好,除了这意味着您认为您分配给的指针类型与 long 大小相同,因此有点令人困惑。
我认为使用NULL
更加清晰。
在 C++0x 中,有一个名为nullptr
的新空指针常量nullptr_t
。它可以隐式转换为任何指针类型。
在那之前,我会推荐使用 NULL,但是 0 和 0L 都适用于我听说过的每个实现。
我不能给你一个确切的答案,但不管你的问题的确切答案是什么,只是初始化指针的想法本身0L
是错误的,因为它表明指针的大小与 a 相同long
,这不是必然是真的,当然。
无论编译器是否接受它,无论它是否安全,我都不会这样做,因为它暗示了一个无效的想法。
空指针表示是特定于实现的,但 0 和 0L 都不一定是该实现 - 它们只是用户可以指定空指针的方式,两者都可以。
我应该指出,Bjarne Stroustrup 曾多次表示他的偏好是使用纯 0(而不是 NULL)。
我不同意那些建议使用 NULL 的人,尽管上述三个选项中的任何一个都确实有效。在惯用的 C++ 中,标准选择是 0(也许因为这是 Stroustrup 的偏好:http ://www2.research.att.com/~bs/bs_faq2.html#null )。
0L 将以与 0 相同的方式隐式转换为适当的指针类型;它只是看起来有点奇怪,并且由于 Jesper 给出的原因并没有多大意义。
您可以使用false
, 0
, 0l
, 0L
, 0ul
, 0u
,00
或任何数量的方式来表示文字零。文字零基本上是一个神奇的符号,恰好也对应于一个空指针常量。
如果我们谈论的是一个恰好按位为零的值,并且代码在指针上对其进行 memcpy-ing,那么我们就会遇到上面提到的问题。
额外问题:哪些类型的空指针常量不是按位为零?
我不得不同意每个说 NULL 的人的观点。对于那些喜欢使用 0 的人,我认为你的代码应该说明它的含义。你想要的结果是一个空指针,所以你的代码应该这样说。当您进行比较时,它会更有意义:
if (some_variable == NULL) { ... }
比
if (some_variable == 0) { ... }
将 0L、长整数(64 位)分配给 32 位指针可能会导致问题。正如在另一篇文章中提到的,使用 NULL 将指针初始化为零。