因此,我与我的教授较早地争论过,认为NULL不是指针,但他一直坚持认为这是因为存在诸如NULL指针之类的东西。所以,现在我有点困惑NULL是否真的是一个指针
我已经尝试通过互联网搜索,但是找不到任何答案,所以我的最后选择是在这里
答案 0 :(得分:4)
在C中,NULL
是一个宏,它扩展为空指针常量。
宏是
NULL,它扩展为实现定义的空指针常量; ...
空指针常量是一个整数常量表达式,其值为0
(
例如0
,1-1
,42*0LL
等)或强制转换为(void*)
的表达式。
值为0的整数常量表达式或此类表达式 强制类型转换为void *,称为空指针常量。66)如果为空 将指针常量转换为指针类型,结果 指针,称为空指针,保证将不等于与 指向任何对象或函数的指针。
大多数常见的C实现将NULL
定义为0
,0L
或((void*)0)
。
所以您是是正确的。 NULL
不必是指针。
(IIRC,C ++甚至不允许在(void*)
中进行NULL
的强制转换,这意味着C ++中的NULL
始终具有整数类型。因此,并且因为void*
指针
不要与C ++中的常规指针进行比较,因此C ++> = 11现在有一个特殊的nullptr
关键字。)
答案 1 :(得分:3)
NULL
本身不是指针,它是一个宏,可用于初始化指向其类型的 null指针值的指针。与指针比较时,如果指针是 null指针,则比较相等;如果指针是指向其类型的对象的有效指针,则比较不相等。
char *p = 0;
和char *p = NULL;
之间没有语义上的区别,但是后者更为明确,在其他操作数为NULL
的情况下,使用0
而不是FILE *fp = fopen("myfile", "r");
if (fp == NULL) {
/* report the error */
}
可以提供更多信息显然不是指针,或者与整数比较看起来像类型不匹配:
'\0'
类似地,0
和int
之间的C在语义上没有区别,它们都是0
常量。第一个是空字节,第二个是空值。明智地使用'\0'
,NULL
和NULL
似乎是徒劳的,但也会使代码更容易被其他程序员和自己读取。
混淆可能是由于 null指针拼写错误或被误认为 NULL
指针。仔细地证明了C标准仅使用空指针,并且仅将NULL
称为宏NULL
。
但是请注意,#define NULL ((void*)0)
的一种公认定义NULL
使void
成为指向Products
的空指针。
答案 2 :(得分:0)
关于“指向0的指针”的想法没有问题。
规则是不允许您取消引用它...允许它存在,并且如果创建将符合我能想到的任何“指针性”标准。 只是因为它不是有意义的 指针...