首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我们能把(void *)0称为C中的空指针吗?

我们能把(void *)0称为C中的空指针吗?
EN

Stack Overflow用户
提问于 2020-10-19 09:50:01
回答 3查看 2.3K关注 0票数 4

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

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

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

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

所以我怀疑:

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

还请参阅以下代码:

代码语言:javascript
运行
复制
void *pointer = NULL;

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-10-19 09:55:18

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

在本声明中

代码语言:javascript
运行
复制
void *pointer = NULL;

由于使用空指针常量初始化指针,所以声明了void *类型的指针,该指针是null pointer

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

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

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

代码语言:javascript
运行
复制
memcpy( ( char * )p1, ( char * )p2, n );
票数 5
EN

Stack Overflow用户

发布于 2020-10-19 10:02:01

所以我的疑问是,我们是否可以调用(void *)0作为一个void指针,看看它的定义方式?

这当然是一个空指针。声明void *pointer意味着将pointer声明为指向无效的指针。pointer将不再是一个空指针。它的类型永远不会改变,但值可以从null更改为其他值。另外,表达式(void *)x的基本意思是“将x转换为一个空指针”,所以这个表达式也有指向void的类型指针。

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

我绝不会使用“空空指针”这个短语。空指针是指向null的任何类型的指针。空指针就是指向空的指针。把它们组合成一个短语只会引起混淆。它既是一个空指针,也是一个空指针。任何指针都可以是空指针。考虑到这一点:

代码语言:javascript
运行
复制
int *p = (void*)0;

p是一个空指针,但它不是一个空指针。

票数 4
EN

Stack Overflow用户

发布于 2020-10-19 10:08:03

因此,我怀疑,我们是否可以将(void*)0称为一个空指针,以查看它的定义方式?

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

抛出的赋值不定义变量的类型。例如,在int *ptr = (void*)0;中,ptr是一个int指针,即指向int的指针,不管赋值如何,与void *ptr = (void*)0;void指针(即指向void的指针)一样,这两个指针值都是0,这使得它们都为空指针。

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

无效*指针=空; 我现在该怎么称呼它?空指针,空指针还是空指针?

null pointer是值为0的指针。

void pointer是具有void类型的指针。

null void pointer是一个类型为void的指针,其值为0,它不是一个常规表达式,而是对指针及其值的描述(即它所指向的内存地址,如果定义的话)。

因此,你可以称之为这三者,贬低你想要指什么或你被要求的描述。

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

对于完成工作,这些都是有效的语句,并将产生相同的结果:

代码语言:javascript
运行
复制
void *pointer = (void*)0;
void *pointer = 0;
void *pointer = NULL;

NULL可以定义为(void*)0 (null指针常量),也可以定义为0 (常量文字),两者均有效。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64424954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档