#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("%in", list_pointer->value);
list_pointer = list_pointer->next;
}
return 0;
}
我不明白语法(struct entry *) 0
在这里是什么意思。在我正在阅读的书中,它说它是一个空指针。我试着在网上寻找,但我不知道该输入什么。我得到的"空指针"的谷歌搜索结果与我的预期不同。
任何值为 0 的指针类型都称为空指针。以下是 C 标准 §6.3.2.3 的解释:
- 值为 0 的整数常量表达式或此类表达式 强制转换为类型 void *,称为空指针常量。如果为空 指针常量转换为指针类型,得到的结果 指针,称为空指针,保证与 指向任何对象或函数的指针
空指针是指向内存地址 0 的指针。 大多数系统保留此地址,以便没有对象驻留在其中。 此保留允许将其用作空白地址。
如果您尝试从空指针读取或写入,您将收到运行时错误,有时称为分段错误或空指针异常。
在您的示例中,空指针用于指示列表的结尾。 因此,此条件(struct entry *) 0,
检查您是否已到达列表末尾并且迭代应停止
通常,使用常量 NULL 而不是文字值 0 会考虑更好的形式。 这使得代码更具可读性,并且还涵盖了 NULL 指针不是 0 的极少数情况
强制转换(struct entry *)
只是为了避免编译器警告,因为文本 0 的类型是整数而不是指针。 这是使用常量 NULL 的另一个原因,因为它通常定义为 (void*) 0
在没有编译器警告的情况下与任何指针值相比都很好
它与 NULL 完全相同,即 C 标准中定义的 (void *(0。
空指针初始化为无效或标记为未初始化。空指针也可用而不是下一个指针,因此也指示列表的结尾。