我们可以在 C 中将 (void *)0 称为 void 指针吗?

Nos*_*iii 5 c null pointers void-pointers null-pointer

总结 C 标准,特别是ISO/IEC 9899:201x \xc2\xa76.3.2.3 - 3

\n

如果将指针与常量文字进行比较0,则检查该指针是否为空指针。这0被称为空指针常量。C 标准定义0转换为类型void *既是空指针又是空指针常量。

\n

现在,如果我们看一下(void *)0它是一个指向 的地址(在这种情况下是非法的)void

\n

通常我们可以将这样的地址转换为任何适当的指针数据类型并取消引用它,但在这里即使在将其转换为其他指针类型之后,取消引用它也是非法的。

\n

所以我的疑问是:

\n

我们可以(void *)0按照其定义的方式调用 void 指针吗?

\n

另请参阅下面的代码:

\n
void *pointer = NULL;\n
Run Code Online (Sandbox Code Playgroud)\n

现在我该怎么称呼它呢?void 指针、空指针还是 null void 指针?

\n

Vla*_*cow 6

现在我该怎么称呼它?void 指针、空指针还是 null void 指针?

在这份声明中

void *pointer = NULL;
Run Code Online (Sandbox Code Playgroud)

由于使用空指针常量对其进行初始化,void *因此声明了 a 类型的指针。null pointer

指向任何类型对象的指针都可以是空指针。

使用零整数常量到 的转换void *是因为该类型的指针void *可以隐式转换为任何其他对象指针类型。使用该类型的另一个优点void *是您不能取消引用该类型的指针,因为该类型void始终是不完整的类型。

C 的早期版本没有类型voidvoid使用 type代替type char。例如,在旧的 C 程序中,您可能会遇到类似以下内容的情况

memcpy( ( char * )p1, ( char * )p2, n );
Run Code Online (Sandbox Code Playgroud)

  • 两者都是“void*”类型的“空指针”。你必须明白“void指针”和“空指针”是正交的概念,所以任何指针都可以是void、null、两者或都不是(例如“(int *)0”是一个非void空指针)。 (2认同)
  • @LocalHost 空指针可以是指向任何类型的对象的指针。不仅是 void * 类型。 (2认同)