如何解决我们可以在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;
中,ptr
是int
指针, 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 举报,一经查实,本站将立刻删除。