NULL是指针吗?

时间:2019-04-04 16:16:24

标签: c pointers null conceptual concept

因此,我与我的教授较早地争论过,认为NULL不是指针,但他一直坚持认为这是因为存在诸如NULL指针之类的东西。所以,现在我有点困惑NULL是否真的是一个指针

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

3 个答案:

答案 0 :(得分:4)

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

7.19p3

  

宏是

     

NULL,它扩展为实现定义的空指针常量;   ...

空指针常量是一个整数常量表达式,其值为0( 例如01-142*0LL等)或强制转换为(void*)的表达式。

6.3.2.3p3

  

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

大多数常见的C实现将NULL定义为00L((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'

类似地,0int之间的C在语义上没有区别,它们都是0常量。第一个是空字节,第二个是空值。明智地使用'\0'NULLNULL似乎是徒劳的,但也会使代码更容易被其他程序员和自己读取。

混淆可能是由于 null指针拼写错误或被误认为 NULL指针。仔细地证明了C标准仅使用空指针,并且仅将NULL称为宏NULL

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

答案 2 :(得分:0)

关于“指向0的指针”的想法没有问题。

规则是不允许您取消引用它...允许它存在,并且如果创建将符合我能想到的任何“指针性”标准。 只是因为它不是有意义的 指针...