C语言--结构struct

1、结构声明:
    struct tag{member-list}variable-list;
    其中:tag、member-list和variable-list都是可选的,但是所有可选部分不能全部省略--他们至少要出现两个(这个规则的一个例外是:结构标签的不完整声明)
2、结构的自引用:
    在一个结构内部包含一个类型为该结构本身的成员是否合法呢?
    struct SELF_REF1{
        int a;
        struct SELF_REF1 b;
        char c;
    };
    这种类型的自引用是非法的,因为成员b是另一个完整的结构,其内部还将包含它自己的成员b。这第二个成员又是一个完整的结构,它将包括它自己的成员b。这样重复下去永无止境。这有点像永远不会终止的递归程序。但下面这个声明却是合法的:
    struct SELF_REF2{
        int a;
        struct SELF_REF2 *b;
        char c;
    };
    这个声明和前面的那个声明区别在于b下载是一个指针而不是一个结构。编译器在结构的长度确定的之前就已经知道这个指针的长度,所以这种类型的自引用是合法的。
    警告:警惕下面的这个陷阱:
    typedef struct{
        int a;
        SELF_REF3 *b;
        char c;
    }SELF_REF3;
    这个声明的目的是为这个结构创建类型名SELF_REF3。但是,它失败了,类型名直到声明的末尾才定义,所以在结构声明的内部它尚未定义。
    解决方案是定义一个结构标签来声明b,如下所示:
    typedef struct SELF_REF3_TAG{
        int a;
        struct SELF_REF3_TAG *b;
        char c;
    }SELF_REF3;
3、不完整的声明:
    偶尔,你必须声明一些相互之间存在依赖的结构。也就是说,其中一个结构包含了另一个结构的一个或多个成员。和自引用结构一样,至少有一个结构必须在另一个结构内部以指针的形式存在。
    不完整声明,它声明一个作为结构标签的标识符,然后,我们可以把这个标签用在不需要知道这个结构的长度的声明中,如声明指向这个结构的指针。
    例如;
    struct B;
    struct A{
        struct *B;
        /*other member-list*/
    };
    struct B{
        struct *A;
        /*other member-list*/
    };
    在A的成员列表中需要标签B的不完整的声明。一旦A被声明之后,B的成员列表也可以被声明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值