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的成员列表也可以被声明。

猜你喜欢

转载自blog.csdn.net/tyustli/article/details/86531237