<snake> </snake>
在代码中,struct LinkedList
{
int data;
struct LinkedList *next;
};
的定义中有一个指向结构本身的指针。
它是如何运作的?
答案 0 :(得分:6)
所以,代码
struct LinkedList
{
int data;
struct LinkedList *next;
};
定义一个包含两个名为data
和next
的成员的结构类型,next
成员存储相同类型的不同对象的地址。鉴于代码:
struct LinkedList Node1 = { .data = 1, .next = NULL };
struct LinkedList Node0 = { .data = 0, .next = &Node1 };
你得到的东西看起来像这样:
Node0 Node1
+---+--------+ +---+------+
| 0 | &Node1 |--->| 1 | NULL |
+---+--------+ +---+------+
(请注意,您将从不以这种方式创建链接列表,这仅用于说明)。
这可能有两个原因:
struct
类型的指针都具有相同的大小和表示形式。这是一个自引用数据类型的示例,它只是意味着该类型将引用(指针)存储到相同类型的不同对象。
答案 1 :(得分:4)
你所谈论的是递归数据结构,问题是如何让数据结构引用自己。
在C中,这可以通过在数据结构的定义中声明指向自身的指针来完成,“self”意味着它自己的类型。
请注意,在编写表达式时,数据结构尚未完成。因此,不可能让数据结构包含其自身的出现,因为该定义尚未完全知道,因为数据结构将永远不会包含其自身的出现本身,...
但是你可以声明一个指向它自己的指针。编译器现在只为指针分配存储空间,如果稍后分配/取消引用指针,它知道指向的存储包含自身的出现。这就是你在你的例子中所做的。
答案 2 :(得分:2)
一个自引用指针,指向它所属的任何地址。例如,
typedef struct node {
char data[30];
struct node *this;
struct node *next;
} Node;
*如果将指针分配给应用于的任何内容,则这是一个自引用指针。
和
显然,Cell不能包含另一个单元格,因为它变成永无止境的递归。
但是,Cell CAN包含指向另一个单元格的指针。
同时参考this post。