所以,我早些时候和我的教授争辩说,NULL不是一个指针,但他坚持认为这是因为有一个像NULL指针这样的东西。所以,如果NULL真的是一个指针,我现在有点困惑
我已经尝试过通过互联网搜索但找不到任何答案,所以我的最后手段就在这里
在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
关键字。)
NULL
本身不是指针,它是一个宏,可用于初始化指向其类型的空指针值的指针。与指针比较时,如果指针是空指针则比较相等,如果指针是指向其类型对象的有效指针则不相等。
char *p = 0;
和char *p = NULL;
之间没有语义差异,但后者更明确,使用NULL
而不是0
在其他操作数显然不是指针或者比较整数看起来像类型不匹配的情况下更具信息性:
FILE *fp = fopen("myfile", "r");
if (fp == NULL) {
/* report the error */
}
类似地,'\0'
和0
之间的C没有语义差异,它们都是int
常数。第一个是空字节,第二个是空值。明智地使用0
,'\0'
和NULL
可能看起来徒劳无功,但使其他程序员和自己的代码更具可读性。
混淆可能来自拼写错误或误导空指针作为NULL
指针。 C标准经过仔细校对,只使用空指针,并仅将NULL
称为宏NULL
。
但请注意,NULL
,#define NULL ((void*)0)
的公认定义使得NULL
成为void
的空指针。
没有关于“指向地址0的指针”这个问题的想法。
规则是你不允许你去除它...它被允许存在,如果被创建将符合我可以想到的“指针”的任何标准。只是因为它没有意义上指向某事物的指针......