C语言 NULL 是指针吗?



所以,我之前和我的教授争论过,为NULL 不是指针辩护,但他一直坚持认为这是因为存在 NULL 指针这样的东西。所以,在这里我现在有点困惑 NULL 是否真的是一个指针

我已经尝试过在互联网上搜索,但找不到任何答案,所以我最后的手段在这里

在 C 中,NULL是一个扩展到空指针常量的宏。

7.19p3

宏是

NULL 扩展到实现定义的空指针常量; ...

空指针常量是值为0( 例如,01-142*0LL等)或这样的表达投给(void*).

6.3.2.3p3

值为 0 的整数常量表达式或此类表达式 强制转换为类型 void *,称为空指针常量。66) 如果为 null 指针常量转换为指针类型,得到的结果 指针,称为空指针,保证与 指向任何对象或函数的指针。

最常见的C实现将NULL定义为00L((void*)0)

所以你是对NULL不必是一个指针。

(IIRC,C++甚至不允许在NULL中强制转换(void*),这意味着C++中的NULL总是具有整数类型。正因为如此,也因为void*指针 不要在C++中如此容易地与常规指针进行比较,C++>=11 现在有一个特殊的nullptr关键字。

NULL本身不是指针,它是一个宏,可用于初始化指向其类型的null 指针值的指针。与指针相比,如果指针为null指针,则比较相等,如果指针是指向其类型的对象的有效指针,则比较不相等。

char *p = 0;char *p = NULL;之间没有语义差异,但后者更明确,并且在另一个操作数不是明显指针的情况下使用NULL而不是0更具信息性,或者如果与整数进行比较看起来像类型不匹配:

FILE *fp = fopen("myfile", "r");
if (fp == NULL) {
/* report the error */
}

类似地,''0之间的C在语义上没有差异,它们都是int常数。第一个是空字节,第二个是空值。明智地使用0''NULL可能看起来是徒劳的,但使代码更容易被其他程序员和自己阅读。

混淆可能来自拼写错误或错误地听到空指针作为NULL指针。C标准经过仔细校对,仅使用空指针,仅将NULL称为宏NULL

但请注意,一个公认的定义NULL#define NULL ((void*)0)使NULL成为指向void空指针

"指向地址 0 的指针"的想法没有任何问题。

规则是不允许你取消引用它...它是允许存在的,如果创建将满足我能想到的任何"指针"标准。 仅仅因为它不是指向某物有意义的指针......

相关内容

  • 没有找到相关文章

最新更新