C语言复习之结构体基础知识(2)

三.结构成员的访问
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的成员列表也可以被声明。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ppwps.html