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