什么是c中的空指针

时间:2018-04-07 22:14:09

标签: c pointers null

#include <stdio.h>

int main(void)
{
    struct findEntry
    {
        int value;
        struct entry *next;
    };

    struct entry n1, n2, n3;
    struct entry *list_pointer = &n1;

    n1.value = 100;
    n1.next = &n2;

    n2.value = 200;
    n2.next = &n2;

    n3.value = 300;
    n3.next = (stuct entry *) 0;

    while (list_pointer != (struct entry *)0) {
        printf("%i\n", list_pointer->value);
        list_pointer = list_pointer->next;
    }
    return 0;
}

我不明白语法(struct entry *) 0是什么意思。在我正在阅读的书中,它说它是一个空指针。我尝试在网上看,但我不确切知道要输入什么。我为“空指针”获得的Google搜索结果与我的预期不同。

4 个答案:

答案 0 :(得分:5)

任何值为0的指针类型都称为空指针。以下是C标准§6.3.2.3的解释:

  
      
  1. 值为0的整型常量表达式,或者这样的表达式   强制转换为void *,称为空指针常量。如果为null   指针常量被转换为指针类型,由此产生   指针,称为空指针,保证比较不等于a   指向任何对象或函数的指针
  2.   

答案 1 :(得分:3)

空指针是指向内存地址0的指针。大多数系统保留此地址,以便不会有任何对象驻留在那里。此预订允许将其用作空白地址。

如果您尝试从空指针读取或写入,您将收到运行时错误,有时称为分段错误或空指针异常。

在您的示例中,空指针用于指示列表的结尾。所以这个条件(struct entry *) 0,检查你是否已经到达列表的末尾并且迭代应该停止

通常认为使用常量NULL而不是字面值0更好的形式。这使得代码更具可读性,并且还涵盖了当NULL指针不是0时非常罕见的情况

强制转换(struct entry *)只是为了避免编译器警告,因为文字0的类型是整数而不是指针。这是使用常量NULL的另一个原因,因为它通常被定义为(void*) 0,它可以很好地与任何指针值进行比较而不需要编译器发出警告

答案 2 :(得分:1)

它完成与NULL完全相同的工作,即C标准中定义的(void *)0。

答案 3 :(得分:0)

空指针被初始化为无效指针或被标记为未初始化。 NULL 指针也可用 而不是下一个指针,因此也指示列表的结尾。