我们今天刚刚被介绍到链表中,我明白了这个概念,但是声明困扰着我,这是代码:
struct Node
{
int data;
struct Node *next;
};
为什么这不是无限循环的声明?
编译器如何识别struct Node
中的struct Node?
对第二个问题视而不见后,我的观察方式如下:
答案 0 :(得分:10)
- 创建第一个结构中的指针所指向的结构,它包含一个整数和一个指向相同类型结构的指针。
这是您无法进行推理的地方。创建指向某物的指针不会自动创建它应该指向的物。因此,第一个对象是在其中创建一个指针的事实,并不意味着该指针将指向有效的对象。就像我写:
int *p;
它没有指向任何东西。 pointer 的值不确定。我可以初始化指针:
int *p = NULL;
它仍然没有指向任何东西。但是我可以给它一些地址:
int i = 1;
int *p = &i;
现在现在指向某物。节点中的指针也是如此。只能使该节点保留某个节点的地址,但不必这样做。这就是为什么链表不仅是节点的声明,而且是一组功能(操作)的原因。这些功能旨在确保列表处于有效状态。每个节点都指向另一个节点,或者指向一个定义良好的终止符。
答案 1 :(得分:1)
为什么这不是无限循环的声明?
首先确定指针为指针,它指向int
,char
,{{1} }或double
本质上是某些内容开始的内存地址,其大小由体系结构确定。这就是为什么您可以在刚创建的struct
中声明指针的原因。如果运行此代码:
struct
这会给您带来错误,因为struct node {
int val;
struct node next; // NOTE: I omitted * so it is not pointer it is struct
};
是未知,因此其大小也是未知的。所以相比:
struct node
指针类型是已知的,此处未知的是指针所指向的类型。指针的大小也是已知的,因此您不会递归。
指向指针。在C中:
struct node {
int val;
struct node *next;
};
是完全合法的,并且程序员应对此进行跟踪。因此,底行int a = 5;
int *p = &a;
char *c = p;
是指向下一个节点(的地址)的指针。这就是为什么您没有struct node *next
发生的原因。
编译器如何识别struct Node内部的struct Node? p>
不是!!!这就是为什么我的第一个示例不起作用!!它识别指针类型。您基本上可以这样写:
recursion
与您的计算机相同:
struct node {
int val;
void *next;
};
希望这对您有所帮助。