什么是c中的空指针

什么是c中的空指针,c,pointers,null,C,Pointers,Null,我不明白这里的语法结构条目*0是什么意思。在我正在读的书中,它说它是一个空指针。我试着在网上查找,但我不知道到底要键入什么。我得到的“NULL pointer”的谷歌搜索结果与我预期的不同。它的工作与NULL完全相同,即C标准中定义的void*0 Null指针是指向内存地址0的指针。大多数系统保留此地址,这样就不会有对象驻留在其中。此保留允许将其用作空白地址 如果您尝试从空指针读取或写入,您将得到运行时错误,有时称为分段错误或空指针异常 在您的示例中,空指针用于指示列表的结尾。所以这个条件str

我不明白这里的语法结构条目*0是什么意思。在我正在读的书中,它说它是一个空指针。我试着在网上查找,但我不知道到底要键入什么。我得到的“NULL pointer”的谷歌搜索结果与我预期的不同。

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

Null指针是指向内存地址0的指针。大多数系统保留此地址,这样就不会有对象驻留在其中。此保留允许将其用作空白地址

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

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

通常认为使用常量NULL而不是文字值0是更好的形式。这使代码更具可读性,并且还涵盖了空指针不是0的极少数情况


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

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

值为0的整型常量表达式或此类表达式 转换为void*类型称为空指针常量。如果为空 指针常量转换为指针类型,结果为 指针,称为空指针,保证与 指向任何对象或函数的指针
空指针初始化为无效指针或标记为未斜体。空指针也可用
而不是下一个指针,因此也指示列表的结尾。

n2中还有一个输入错误。next=&n2;,这意味着我们永远不会到达n3。我只想扔掉这个糟糕的例子,研究一下其他一些代码。struct entry*0是编写NULL的糟糕方法。获取一本新书。请注意,您的代码定义了类型struct findEntry,其中包含指向不完整类型struct条目的指针。无法定义n1等,因为结构项是不完整的类型。定义struct entry而不是struct findEntry所需的更改最少,或者您可以在整个过程中将struct entry更改为struct findEntry。另外,n3.next=stuct entry*0;中有一个输入错误结构中有一个r。请发布编译的代码!另外,您的行n2.next=&n2;在列表中为您提供一个循环,并保留n3未使用。一旦代码编译,打印循环将运行很长时间。我认为代码的作者使用C++编译器。它与Vault* 0不完全相同,因为类型不同,一个是空指针,另一个是StuttItj*。我打赌,原始作者使用C++编译器,并正在获得错误。这就是C语言中这种奇怪赋值的可能原因。说明:宏为NULL,扩展为实现定义的NULL指针常量…空指针常量定义为在其中引用。它不一定是void*0,尽管这是一个广泛使用的非常常见的值。有些编译器可能会对此发出警告,但标准中最明确的要求是不需要任何此类警告。根据标准,使用无强制转换的纯0是合法的。答案正确吗?
#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;
}