C语言结构类型的定义

结构类型是在程序中定义的类型,以指定记录的格式,它包括成员名称和类型,以及成员在内存中的存储次序。一旦定义了结构类型,就可以像使用其他所有类型一样使用这种结构类型,可以声明具有这种结构类型的对象,定义指向这种对象的指针,以及定义具有这种结构类型元素的数组。

结构类型的定义从关键字 struct 开始,大括号内包含声明结构成员的列表

struct [标签名称] {成员声明列表};


结构必须包含至少一个成员。下面的例子定义了 struct Date 类型,它有 3 个 short 类型的成员:
struct Date { short month, day, year; };

标识符 Date 是该结构类型的标签(tag)。标识符 year、month 和 day 是成员名称。结构类型的标签属于一个不同的命名空间:即使结构标签与变量名或函数名相同,编译器也仍然可以区分。类似地,对于每个结构类型,其中的每个结构成员名称都属于不同的命名空间。

结构的成员,可以定义为任何所需的完整类型,包括之前已定义的结构类型。但是不能是长度可变的数组,或者指向长度可变数组的指针。

下面的结构类型 struct Song 有 5 个成员,可以存储关于音乐记录的5种信息。成员 published 的类型是 struct Date,这正是前面的例子中所定义的结构类型:
struct Song { char title[64];
              char artist[32];
              char composer[32];
              short duration;    // 播放时间(秒)
              struct Date published;     // 出版日期
           };

结构类型无法将自己的类型作为其成员的类型,因为自己的类型定义尚不完整,要在结束的大括号(})后才算定义完整。然而,结构类型可以包含指向自己类型的指针,这样的应用很常见。例如,在实现链表(linked list)和二叉树(binary tree)时,就会用到这种自引用结构(self-referential structure)。下面的例子为一个单向链表成员定义了一个类型:
struct Cell { struct Song song;        // 这条记录的数据
              struct Cell *pNext;        // 指向下一条记录的指针
            };

如果在多个源代码文件中使用同一个结构类型,应该将它的定义放在头文件中,再在各个源代码文件中包含该头文件。通常,同一个头文件中也会定义操作该结构类型的函数原型。那么,在所有包含给定头文件的源代码文件中,均可以使用该结构类型及其对应的操作函数。