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

Can we call (void *)0 a void pointer in C?

总结C标准,具体ISO/IEC 9899:201x §6.3.2.3 - 3:

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

现在,如果我们查看 (void *)0,它是一个指向 void 的地址(在此上下文中是非法的)。

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

所以我的疑问是:

我们可以将 (void *)0 称为空指针,看看它的定义方式吗?

另见以下代码:

void *pointer = NULL;

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

What will i call it now ? A void pointer, a null pointer or a null void pointer ?

在此声明中

void *pointer = NULL;

声明了一个 void * 类型的指针,它是一个 null pointer,因为它是用空指针常量初始化的。

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

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

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

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

So my doubt is can we call (void *)0 as a void pointer looking the way it is defined ?

肯定是空指针。声明 void *pointer 意味着您将 pointer 声明为指向 void 的指针。 pointer 永远不会是空指针。它的 type 永远不会改变,但 value 可以从 null 更改为其他内容。此外,表达式 (void *)x 基本上意味着“将 x 转换为 void 指针。因此该表达式也具有指向 void 的类型指针。

What will i call it now ? A void pointer, a null pointer or a null void pointer?

我永远不会使用“无效指针”这个短语。空指针是任何类型的指针,指向空。 void 指针只是指向 void 的指针。将它们组合成一个短语只会造成混乱。它既是空指针又是空指针。任何指针都可以是空指针。考虑一下:

int *p = (void*)0;

p是空指针,但不是空指针。

So my doubt is can we call (void*)0 as a void pointer looking the way it is defined?

(void*)0 是空指针常量而不是 void 指针。

强制转换的赋值没有定义变量的类型。例如在int *ptr = (void*)0;中,ptr是一个int指针,指向int的指针,无论赋值如何,都一样void *ptr = (void*)0; 是一个 void 指针, 指向 void 的指针,这两个指针的值都是 0 这使得它们都是空指针。

阅读 以获得关于 (void*)0 的有趣的额外信息。


void *pointer = NULL;

What will I call it now ? A void pointer, a null pointer or a null void pointer ?

一个null pointer是一个值为0的指针

A void pointer 是一个具有 void 类型的指针。

a null void pointer是一个void类型的指针,它的值为0,它不是一个约定俗成的表达式,而是对指针是什么以及它的值的描述(它指向的内存地址(如果已定义)。

所以在我看来,您可以将其全部称为三者,具体取决于您要参考的内容或要求的描述。

A null 指针不能被取消引用为 void 或任何其他类型。它的值为 0,它没有指向任何有效的内存位置,这是你不能取消引用它的唯一原因。


为了完成,这些都是有效的陈述,并将产生相同的结果:

void *pointer = (void*)0;
void *pointer = 0;
void *pointer = NULL;

NULL可以定义为(void*)0(空指针常量),或者只是0(常量文字),both are valid.