c - 我们可以在 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;
我现在怎么称呼它?空指针、空指针还是空指针?
解决方案
我现在怎么称呼它?空指针、空指针还是空指针?
在这份声明中
void *pointer = NULL;
由于使用空指针常量对其进行了初始化,因此声明了一个类型void *
为 a的指针。null pointer
指向任何类型对象的指针都可以是空指针。
使用零整数常量的转换void *
是因为该类型的指针void *
可以隐式转换为任何其他对象指针类型。使用该类型的另一个优点void *
是您可能不会取消引用该类型的指针,因为该类型void
始终是不完整的类型。
C 的早期版本没有类型void
。没有使用 type ,而是void
使用了 type char
。因此,例如在旧的 C 程序中,您可能会遇到类似以下内容
memcpy( ( char * )p1, ( char * )p2, n );
推荐阅读
- salesforce - 我们如何为 Salesforce Essentials 创建 Salesforce 开发人员帐户?
- akamai - Akamai NetStorage 是否具有预签名 URL 功能
- javascript - 如何使用 json 数据计算 Angular 中的平均值
- django - 如何从范围滑块的值填充 Django 中隐藏字段的值
- r - 如何消除我在 R 中为 Cowplot 创建的两个图例之间的尴尬垂直间隙?
- android - 在 Listview Item Click 然后根据 viewpager 上的数据图像滑块打开下一个活动
- r - 有没有办法在 r 中只保留日期的年份?
- java - 音频 - 来自 Java 的流式音频是断断续续的
- python-3.x - 如何使用 python pypsexec.client 库在 Windows 远程机器上为命令传递动态输入
- laravel - Vue / Laravel - Axios 发布多个字段