什么是C中的自引用结构?

struct LinkedList { int data; struct LinkedList *next; }; 

在代码中,在struct LinkedList的定义中,有一个指向结构本身的指针。

它是如何工作的?

所以,代码

 struct LinkedList { int data; struct LinkedList *next; }; 

定义一个结构类型,包含两个名为datanext成员, next next成员存储同一类型的不同对象的地址。 鉴于代码:

 struct LinkedList Node1 = { .data = 1, .next = NULL }; struct LinkedList Node0 = { .data = 0, .next = &Node1 }; 

你得到的东西看起来像这样:

 Node0 Node1 +---+--------+ +---+------+ | 0 | &Node1 |--->| 1 | NULL | +---+--------+ +---+------+ 

(请注意,您永远不会以这种方式创建链接列表,这仅用于说明)。

这可能有两个原因:

  1. C允许您声明指向不完整类型的指针;
  2. struct类型的指针都具有相同的大小和表示。

这是一个自引用数据类型的示例,它简单地表示该类型将引用(指针)存储到相同类型的不同对象。

你所谈论的是递归数据结构 ,问题是如何让数据结构引用自己。

在C中,这可以通过在数据结构的定义中声明指向自身的指针来完成,“self”意味着它自己的类型。

请注意,在编写表达式时,数据结构尚未完成。 因此,不可能让数据结构包含其自身的出现,因为该定义尚未完全为人所知,因为数据结构将永远不会包含其自身的出现本身,……

但是你可以声明一个指向自己的指针。 编译器现在只为指针分配存储空间,如果稍后分配/取消引用指针,它就知道指向的存储包含自身的出现。 这就是你在你的例子中所做的。

一个自引用指针,指向它所属的任何地址。 例如,

 typedef struct node { char data[30]; struct node *this; struct node *next; } Node; 

*如果将指针分配给应用的任何内容,则这是一个自引用指针。

,和

显然,Cell不能包含另一个单元格,因为它变成了永无止境的递归。

但是,Cell CAN包含指向另一个单元的指针。

请参阅这篇文章 。