三.结构成员的访问
1.结构成员的直接访问
结构变量的成员是通过点操作符号(.)访问的。点操作符接受两个操作数,左操作数就是结构变量的名字,右操作数就是需要访问的成员的名字。这个表达式的结果就是指定的成员。
2.结构体成员的间接访问
如果你拥有一个指向结构的指针,我们使用->操作符(箭头操作符)和点操作符一样,箭头操作符对左操作符执行间接访问取得指针所指向的结构,然后和点操作符一样,根据右操作数选择一个指定的结构成员。
3.结构的自引用
在一个结构内部包含一个类型为该结构本身的成员是否是合法呢?
Eg:
struct SELF_REF1 {
int a;
struct SELF_REF1 b;
int c;
};
该中类型的应用是非法的,因为成员b是另一个完整的结构,其内部还将包含它自己的成员b。这第2个成员又是另一个完整的结构,它还将包含它自己的成员b。这样就会永无止境。
1>下面的方法是合法的
struct SELF_REF2 {
int a;
struct SELF_REF2 *b;
int c;
};
这个声明和前面的声明区别在于b现在是一个指针而不是结构。编译器在结构的长度确定之前就已经知道指针的长度。所以该中类型的自引用是合法的。
2>以下是个错误的用法
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;
4.不完整的声明
有时候,你必须声明一些相互之间存在依赖的结构。即:其中一个结构包含了另一个结构的一个成员或多个成员。和自引用一样,至少有一个结构必须在另一个结构体内部以指针的形式存在。问题在于声明部分:如果每个结构都引用了其他结构的标签,哪个结构应该首先被声明呢?
1>该问题采用不完整声明来解决。它声明一个作为结构标签的标识符。然后,把这个标签用在不需要知道这个结构的长度的声明中,如声明指向这个结构的指针。接下来的声明把这个标签与成员列表联系在一起。
2>看下面的例子,两个不同类型的结构内部都有一个指向另一个结构的指针。
struct B;
struct A {
struct B *partner;
/*other declarations*/
};
struct B {
struct A *partner;
/*other declarations*/
};
在A成员列表中需要标签B的不完整的声明。一旦A被声明之后,B的成员列表也可以被声明。