杂记之C语言之结构(三)

来源:互联网 发布:lumia 专用软件 编辑:程序博客网 时间:2024/06/06 03:11

结构的自引用

(1)

struct  SELF_REF1           {                       int    a;                       struct   SELF_REF1 b;                       int    c;            };


这种类型的自引用是非法的,有点像永不终止的递归程序。

(2)

struct  SELF_REF2           {                       int    a;                       struct   SELF_REF2 *b;//递归型结构,必须用指针来声明。                           int    c;            };


这个声明和前面的声明的区别在于b现在是一个指针而不是结构。

编译器在结构的长度确定之前就已经知道指针的长度,所以这种类型的自引用是合法的。

事实上它所指向的是同一类型的不同结构,更加高级的数据结构,如链表和树,都是用

这种技巧实现的,每隔结构指向链表的下一个元素或树的下一个分支。

(3)【警告】

警惕这个陷阱:

typedef struct{               int   a;             SELF_REF3  *b;             int   c;}SELF_REF3;


这个声明的目的是为这个结构创建类型名SELF_REF3,但是它失败了,类型名直到的末尾

才定义,所以在结构声明的内部它尚未定义。

解决方案是定义一个结构标签来声明b,如下

typedef   struct  SELF_REF3_TAG{                int   a;                struct  SELF_REF3_TAG  *b;//必须同时出现在同一行                   int    c;}SELF_REF3;

原创粉丝点击