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的成员列表也可以被声明。
C语言--结构struct
猜你喜欢
转载自blog.csdn.net/tyustli/article/details/86531237
今日推荐
周排行