我们可以在C中调用(void*)0作为void指针吗



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

如果将指针与常量文字0进行比较,则这是一次检查,以查看该指针是否为空指针。该0随后被称为空指针常量。C标准定义了类型为void *0既是空指针又是空指针常量。

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

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

所以我的怀疑是:

我们可以将(void *)0作为一个空指针来调用吗?

另请参阅以下代码:

void *pointer = NULL;

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

我现在该怎么称呼它?void指针、null指针或null无效指针?

在此声明中

void *pointer = NULL;

由于用空指针常数初始化CCD_ 8类型的指针而声明为CCD_。

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

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

早期版本的C没有void类型。使用类型CCD_ 16来代替类型void。例如,在旧的C程序中,您可能会遇到以下

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

所以我的疑问是,我们可以按照定义的方式调用(void*(0作为void指针吗?

它肯定是一个空指针。声明void *pointer意味着您将pointer声明为指向void的指针。pointer永远不会是一个空指针。它的类型永远不会更改,但可以从null更改为其他值。此外,表达式(void *)x基本上表示";将x强制转换为空指针`。所以这个表达式还有指向void的类型指针。

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

我永远不会用短语";空指针";。null指针是任何类型的指针,指向null。void指针只是指向void的指针。把它们组合成一个短语只会造成混淆。它既是一个空指针,也是一个null指针。任何指针都可以是空指针。考虑一下:

int *p = (void*)0;

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

所以我的疑问是,我们可以按照定义的方式将(void*)0调用为空指针吗

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

强制转换的赋值未定义变量的类型。例如,在int *ptr = (void*)0;中,ptrint指针,是指向int的指针,与分配无关,就像void *ptr = (void*)0;void指针,指向void的指针一样,这两个指针的值都是0,这使它们都是空指针。

阅读Lundin在下面的评论,了解更多关于(void*)0的有趣信息。


void *pointer = NULL;

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

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

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

null void pointervoid类型的指针,其值为0,这不是一个传统的表达式,而是指针是什么及其值的描述(,即它指向的内存地址,如果定义的话(。

因此,IMO你可以称之为三者,这取决于你想参考的内容或你被要求的描述。

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


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

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

NULL可以定义为(void*)0(空指针常量(,也可以定义为仅0(常量文字(,两者都是有效的。

最新更新