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

结构的自引用

(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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值