2

这个问题中,初始化器用于将指针设置为空。而不是使用 value of 的00L。我读过应该完全0使用空指针,因为确切的空指针表示是特定于实现的。

移植时可以使用0L将指针设置为 null 导致问题吗?

4

9 回答 9

16

从标准(4.10.1):

空指针常量是整数类型的整数常量表达式 (5.19) 右值,其计算结果为零

所以我想没0L问题。

于 2009-12-15T14:49:16.613 回答
13

我认为0L这很好,除了这意味着您认为您分配给的指针类型与 long 大小相同,因此有点令人困惑。

我认为使用NULL更加清晰。

于 2009-12-15T14:52:15.280 回答
4

在 C++0x 中,有一个名为nullptr的新空指针常量nullptr_t。它可以隐式转换为任何指针类型。

在那之前,我会推荐使用 NULL,但是 0 和 0L 都适用于我听说过的每个实现。

于 2009-12-15T14:55:01.517 回答
3

我不能给你一个确切的答案,但不管你的问题的确切答案是什么,只是初始化指针的想法本身0L是错误的,因为它表明指针的大小与 a 相同long,这不是必然是真的,当然。

无论编译器是否接受它,无论它是否安全,我都不会这样做,因为它暗示了一个无效的想法。

于 2009-12-15T14:50:23.363 回答
2

空指针表示是特定于实现的,但 0 和 0L 都不一定是该实现 - 它们只是用户可以指定空指针的方式,两者都可以。

我应该指出,Bjarne Stroustrup 曾多次表示他的偏好是使用纯 0(而不是 NULL)。

于 2009-12-15T14:51:42.723 回答
2

我不同意那些建议使用 NULL 的人,尽管上述三个选项中的任何一个都确实有效。在惯用的 C++ 中,标准选择是 0(也许因为这是 Stroustrup 的偏好:http ://www2.research.att.com/~bs/bs_faq2.html#null )。

0L 将以与 0 相同的方式隐式转换为适当的指针类型;它只是看起来有点奇怪,并且由于 Jesper 给出的原因并没有多大意义。

于 2009-12-15T15:00:09.570 回答
2

您可以使用false, 0, 0l, 0L, 0ul, 0u,00或任何数量的方式来表示文字零。文字零基本上是一个神奇的符号,恰好也对应于一个空指针常量。

如果我们谈论的是一个恰好按位为零的值,并且代码在指针上对其进行 memcpy-ing,那么我们就会遇到上面提到的问题。

额外问题:哪些类型的空指针常量不是按位为零?

于 2009-12-15T22:57:39.347 回答
1

我不得不同意每个说 NULL 的人的观点。对于那些喜欢使用 0 的人,我认为你的代码应该说明它的含义。你想要的结果是一个空指针,所以你的代码应该这样说。当您进行比较时,它会更有意义:

if (some_variable == NULL) { ... }

if (some_variable == 0) { ... }
于 2009-12-15T19:04:44.490 回答
-2

将 0L、长整数(64 位)分配给 32 位指针可能会导致问题。正如在另一篇文章中提到的,使用 NULL 将指针初始化为零。

于 2009-12-15T14:54:19.630 回答