首页 > 解决方案 > 我们可以在 C 中将 (void *)0 称为 void 指针吗?

问题描述

总结 C 标准,特别是ISO/IEC 9899:201x §6.3.2.3 - 3

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

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

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

所以我的疑问是:

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

另请参阅以下代码:

void *pointer = NULL;

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

标签: cpointersnullvoid-pointersnull-pointer

解决方案


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

在这份声明中

void *pointer = NULL;

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

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

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

C 的早期版本没有类型void。没有使用 type ,而是void使用了 type char。因此,例如在旧的 C 程序中,您可能会遇到类似以下内容

memcpy( ( char * )p1, ( char * )p2, n );

推荐阅读