所以,我之前和我的教授争论过,为NULL 不是指针辩护,但他一直坚持认为这是因为存在 NULL 指针这样的东西。所以,在这里我现在有点困惑 NULL 是否真的是一个指针
我已经尝试过在互联网上搜索,但找不到任何答案,所以我最后的手段在这里
在 C 中,NULL
是一个扩展到空指针常量的宏。
7.19p3
宏是
NULL 扩展到实现定义的空指针常量; ...
空指针常量是值为0
( 例如,0
、1-1
、42*0LL
等)或这样的表达投给(void*)
.
6.3.2.3p3
值为 0 的整数常量表达式或此类表达式 强制转换为类型 void *,称为空指针常量。66) 如果为 null 指针常量转换为指针类型,得到的结果 指针,称为空指针,保证与 指向任何对象或函数的指针。
最常见的C实现将NULL
定义为0
、0L
或((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 的指针"的想法没有任何问题。
规则是不允许你取消引用它...它是允许存在的,如果创建将满足我能想到的任何"指针"标准。 仅仅因为它不是指向某物的有意义的指针......