我有点困惑。
struct node *p; and if(p==NULL)
现在根据我的研究收集的是,NULL不是存储器地址,而是存储器地址中的值(即0)。当我使用if(*p==NULL)
时,它会出错 - 与'operator =='不匹配。但是*p
没有给出内存地址中的值。如果我们只使用p
,我们不会将内存地址与内存地址中的值进行比较。为什么p==NULL
正确而*p=NULL
不正确。
答案 0 :(得分:3)
是的,*p
给出了内存地址中的值。但在这种情况下,该值为struct node
,因为p
的类型为“指向struct node的指针”。您无法将结构的值与NULL进行比较。
答案 1 :(得分:2)
如果我们只使用
p
我们不是将内存地址与内存地址中的值进行比较
没有。当我们根据NULL
标准,章节§7.19,C11
,(强调我的)谈论<stddef.h>
时
NULL
它扩展为实现定义的空指针常量; [...]
因此,NULL
是一个指针,在您的代码中,p
也是如此。所以,你可以比较它们。
OTOH,*p
是一个值,您无法将其与NULL
进行比较。
答案 2 :(得分:1)
我认为你在这里对NULL有误解。 NULL确实起到地址的作用 - 它是一个指针无效的值。无法检索地址为NULL的内存。 NULL不是存储在指针中的值。 NULL是一个指针,虽然它是系统相关的,但它通常指向内存地址0,我认为这是混淆的根源。
NULL与指针(通常定义为(void *)0)相当。从void *到struct节点的转换将给出编译器警告并且没有意义。
另外,将* p与NULL进行比较涉及首先取消引用p(即UB)
NULL可能具有值0,但它不能与任何非指针进行比较。因此,为了解决您的问题,正如评论者所说,您必须改变您的比较
if (*p == NULL)
结构与内存地址的比较,
if (p == NULL)
将内存地址p与存储在NULL中的地址值进行比较。