【问题标题】:What is self-referencing structure in C?什么是 C 中的自引用结构?
【发布时间】:2017-01-02 05:33:06
【问题描述】:
struct LinkedList  
{  
    int data;
    struct LinkedList *next;
};

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

它是如何工作的?

【问题讨论】:

  • 自引用 指针 在 C 中是不可能的,因为类型会不兼容:int * p = &p; 类型的 &pint **
  • 你的 C 书怎么说?从struct 定义和指针中你应该从那时学到的东西中具体不能推断出什么?如果你这样做了:不要逃课!
  • 但我在结构中发现了这个。
  • 唯一的自引用指针是void *。法律上不能有其他自引用指针。 (是否有任何语言允许它是有用的?)

标签: c linked-list structure


【解决方案1】:

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

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

*这是一个自引用指针,如果它被分配给任何应用的对象。

,和

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

但是,一个单元格可以包含指向另一个单元格的指针。

也请参阅this post

【讨论】:

  • 唯一的自引用指针是void *。法律上不能有其他自引用指针!
  • 是的兄弟,你可以通过stackoverflow.com/questions/588623/…
  • @Olaf,它并不是字面上的自我参照;但它避免了引用自身的递归。好聪明 ! :)
  • 链接数据结构从一开始就很常见。对 C 来说并不新鲜。但这里与任何其他 struct xy * 有什么不同?没有!声明指针的位置没有任何区别。但也许:“任何一种更高的技术都可能在不知情的情况下看起来像魔法”(我的翻译,发现者可能会保留任何缺陷)
【解决方案2】:

您所说的是递归数据结构,问题是如何让数据结构引用自身。

在 C 中,这可以通过在数据结构的定义中声明一个指向自身的指针来完成,“self”表示它自己类型的事物。

请注意,当您编写表达式时,数据结构尚未完成。因此,不可能让数据结构包含其自身的出现,一次是因为尚未完全了解定义,二是因为数据结构将永远不会结束包含其自身的出现......

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

【讨论】:

    【解决方案3】:

    所以,代码

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

    定义了一个结构体类型,其中包含两个名为datanext 的成员,其中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 类型的指针都具有相同的大小和表示形式。

    这是一个自引用数据类型的例子,它仅仅意味着该类型存储了对同一类型的不同对象的引用(指针)。

    【讨论】:

      猜你喜欢
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2012-11-29
      • 2016-01-03
      • 2019-02-19
      • 1970-01-01
      • 2011-05-31
      相关资源
      最近更新 更多