目录
- struct tag {
- member-list;
- member-list;
- member-list;
- ...
- } variable-list;
tag 是结构体类型的标签。
member-list 结构体的元素定义,比如 int i; 或者 float f,或者其他有效的变量定义。注意此处使用“;”结尾。
variable-list 结构体变量,定义在结构的末尾,最后一个分号之前,可以指定一个或多个结构变量。结构体标签和结构体变量可以不必同时出现。
- typedef struct
- {
- int a;
- char b;
- double c;
- } Simple_t;
-
- Simple_t u1, u2[20], *u3;
现在可以用Simple_t作为类型声明新的结构体变量。
(C99 6.2.5)不完整类型(incomplete types):与对象类型相反,包括那些类型信息不完整的对象类型(incompletely-defined object type)以及空类型(void)。
有时候,必须声明一些相互之间存在依赖的结构,可能是自包含,也可能互相依赖,这时就需要不完全声明。
情况一:自包含
- //此结构体的声明包含了指向自己类型的指针
- struct NODE
- {
- char string[100];
- struct NODE *next_node;
- };
情况二:互相包含
- struct B; //对结构体B进行不完整声明
-
- //结构体A中包含指向结构体B的指针
- struct A
- {
- struct B *partner;
- //other members;
- };
-
- //结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
- struct B
- {
- struct A *partner;
- //other members;
- };
注意:以上两种结构体声明中的元素都是指针指向结构体,没有遇到过不是指针的(理论上也不可行)。
注意:要分清结构体类型声明和变量定义(声明是不会占用内存空间的,而变量定义会占用相应内存空间)。如:
- struct Student{ //声明结构体
- char name[20]; //姓名
- int num; //学号
- float score; //成绩
- };
是结构体类型声明;
struct Student student1;
是结构体变量定义;
- struct Student{ //声明结构体
- char name[20]; //姓名
- int num; //学号
- float score; //成绩
- }student1;
是结构体类型声明的同时定义一个结构体变量。
- struct Books
- {
- char title[50];
- char author[50];
- char subject[100];
- int book_id;
- } book = {"C 语言", "RUNOOB", "编程语言", 123456};
- # include <stdio.h>
- struct AGE
- {
- int year;
- int month;
- int day;
- };
- struct STUDENT
- {
- char name[20];
- int num;
- struct AGE birthday;
- float score;
- };
- int main(void)
- {
- struct STUDENT student1 = {"小明", 1207041, {1989, 3, 29}, 100};
- return 0;
- }
注意:STUDENT是结构体类型的标签,而不是结构体变量。
- struct STUDENT student1;
- student1.num = 1207041;
(C99标准)指定初始化(designated initializer),指定部分/全部元素初始化。
- struct book gift =
- {
- .value = 25.99,
- .author = "James Broadfool",
- .title = "Rue for the Toad"
- };
注意:最后一个元素赋值后边加不加逗号都没有问题。