#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搜索结果与我的预期不同。
答案 0 :(得分:5)
任何值为0的指针类型都称为空指针。以下是C标准§6.3.2.3的解释:
- 值为0的整型常量表达式,或者这样的表达式 强制转换为void *,称为空指针常量。如果为null 指针常量被转换为指针类型,由此产生 指针,称为空指针,保证比较不等于a 指向任何对象或函数的指针
醇>
答案 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 指针也可用 而不是下一个指针,因此也指示列表的结尾。