§10.1 概述
结构体(structure)是一种构造的数据类型,它把互相联系的数据组合成一个整体。例、

一个学生的学号、姓名、性别、年龄、成绩、地址,是互相联系的数据,在C语言中用“结构体(structure)”来定义。
struct student
{
int num; /* 学号 */
char name[20]; /* 姓名 */
char sex; /* 性别 */
int age; /* 年龄 */
float score; /* 成绩 */
char addr[30]; /* 地址 */
};
结构体类型定义描述结构的组织形式,不分配内存.
struct 是关键字,不能省略。
student 是定义的结构体类型名。
结构体中的每一项数据,称为结构体“成员”(member)或“分量”。
“结构体”在大多数资料中被称为“结构”。
§10.2 结构体变量的定义
结构体是一种数据类型(像int、char、flaot是数据类型一样),可以用它定义变量。
用结构体类型定义变量的方式有三种:
一、先定义结构体类型,再定义变量
一般形式:struct 结构体名
{
类型标识符 成员名;
类型标识符 成员名;
…………….};
struct 结构体名 变量名表列;
例、struct student
{
int num; /* 学号 */
char name[20]; /* 姓名 */
char sex; /* 性别 */
int age; /* 年龄 */
float score; /* 成绩 */
char addr[30]; /* 地址 */
};
struct student student1, student2;

结构体变量中的各成员,在内存中顺序存放。结构体变量所占内存大小用运算符sizeof计算。
例、printf(" %d %d \n",sizeof(struct student),sizeof(student1));
为了方便,可以这样定义结构体变量:
#define STUDENT struct student
STUDENT
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
STUDENT student1, student2;
二、在定义类型的同时定义变量
一般形式:struct 结构体名
{
类型标识符 成员名;
类型标识符 成员名;
…………….
}变量名表列;
例:struct student
{
int num; /* 学号 */
char name[20]; /* 姓名 */
char sex; /* 性别 */
int age; /* 年龄 */
float score; /* 成绩 */
char addr[30]; /* 地址 */
}student1, student2;
三、直接定义变量
一般形式:struct
{
类型标识符 成员名;
类型标识符 成员名;
…………….
}变量名表列;(用无名结构体直接定义变量只能一次)
例:struct
{
int num; /* 学号 */
char name[20]; /* 姓名 */
char sex; /* 性别 */
int age; /* 年龄 */
float score; /* 成绩 */
char addr[30]; /* 地址 */
}student1, student2;
四、成员是另一个结构体变量
struct date /* 日期结构 */
{
int month; /* 月 */
int day; /* 日 */
int year; /* 年 */
};
struct student
{
int num; /* 学号 */
char name[20]; /* 姓名 */
char sex; /* 性别 */
int age; /* 年龄 */
struct date birthday; /* 成员是另一个结构体变量 */
char addr[30]; /* 地址 */
} student1, student2;
说明:
结构体类型与结构体变量概念不同
类型:不分配内存; 变量:分配内存
类型:不能赋值、存取、运算; 变量:可以
结构体可嵌套
结构体成员名与程序中变量名可相同,不会混淆
结构体类型及变量的作用域与生存期
§10.3 结构体类型变量的引用
1、一般情况下,不能将一个结构体变量作为整体来引用,只能引用其中的成员(分量)。引用结构体成员的
方式:结构体变量名.成员名
.是“成员运算符”(分量运算符)
3、仅在以下两种情况下,可以把结构体变量作为一个整体来访问。
(1)结构体变量整体赋值,例、
student2 = student1;
(2)取结构体变量地址,例、
printf("%x", &student1); /*输出student1的地址 */
§10.4 结构体变量的初始化
形式1:
形式2:
形式3:
注意:不能在结构体内赋初值。例、
struct student
{
long int num = 89031;
char name[20] = "Li Lin";
char sex = 'M';
char addr[30] = "123 Bejing Road";
}a;
教材中,外部存储类型、静态存储类型的讨论,没有意义!
§10.5 结构体数组
一、结构体数组的定义:有三种形式。