内存地址和内存地址中的值

时间:2015-10-05 05:43:58

标签: c pointers null structure

我有点困惑。

struct node *p; and if(p==NULL)

现在根据我的研究收集的是,NULL不是存储器地址,而是存储器地址中的值(即0)。当我使用if(*p==NULL)时,它会出错 - 与'operator =='不匹配。但是*p没有给出内存地址中的值。如果我们只使用p,我们不会将内存地址与内存地址中的值进行比较。为什么p==NULL正确而*p=NULL不正确。

3 个答案:

答案 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中的地址值进行比较。