微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决我们可以在C语言中将void *0称为void指针吗?

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

如果将指针与常量文字0进行比较,则将检查该指针是否为空指针。然后将此0称为空指针常量。 C标准定义了强制转换为类型0的{​​{1}}既是空指针又是空指针常量。

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

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

所以我的疑问是:

我们可以将void称为无效指针吗?

另请参见以下代码

(void *)0

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

解决方法

我现在怎么称呼它?空指针,空指针或空指针 无效指针?

在此声明中

void *pointer = NULL;

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

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

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

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

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

所以我的疑问是我们能否将(void *)0称为无效指针,以了解其定义方式?

它肯定是一个空指针。声明void *pointer意味着您声明pointer作为指向void的指针。 pointer只能是空指针。它的 type 不会改变,但是 value 可以从null更改为其他值。另外,表达式(void *)x的基本含义是“将x投射到void指针`。因此该表达式也具有指向void的类型指针。

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

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

int *p = (void*)0;

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

,

所以我的疑问是我们可以将(void*)0称为无效指针,看看它的定义方式吗?

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

强制转换的赋值未定义变量的类型。例如,在int *ptr = (void*)0;中,ptrint指针, ie 指向int的指针,无论分配如何,都与{ {1}}是void *ptr = (void*)0;指针, ie 是指向void的指针,这两个指针的值均为void,这两个指针都为空指针。

阅读Lundin's comment bellow,了解有关0的有趣信息。


(void*)0

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

void *pointer = NULL; 是一个值为0的指针。

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

void是类型null void pointer的指针,其值为0,它不是常规表达式,而是对指针的含义及其值( ie 指向的内存地址(如果已定义)。

因此,您可以将IMO称为这三个名称,具体取决于您要引用的内容或要求的描述。

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


为完整起见,这些都是有效的语句,它们将产生相同的结果:

void

void *pointer = (void*)0; void *pointer = 0; void *pointer = NULL; 可以定义为NULL(空指针常量),也可以定义为(void*)0(常数文字),both are valid

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。