有些数据具有内在的联系,并且成组出现,而为了反应这些数据之间的关系,我们希望把这些数据组成一个组合数据。而这种作用数组是不具备的,因为数组只能存放同一类型的数据。
C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,也就是结构体。
一、建立结构体类型structre
用户指定一个结构体类型 struct 结构体名,则它就是一个在本程序中可以使用的合法类型名。
声明一个结构体类型的一般形式为:
struct 结构体名
{ 成员列表 };
作用:它向编译系统声明:struct 结构体名是一个“结构体类型”,包括不同类型的成员。它的整体和系统提供的标准类型(如int,char,floar等)具有相似的作用,在之后的程序中都可以定义变量。但是结构体在引用之前必须先声明。
说明:
结构体的成员都应该进行类型声明,即 类型名 成员名;
可以将已经声明的结构体类型作为另一个结构体的成员。
例如:
struct
Date //声明一个结构体类型struct Date
{ int month;
int day;
int yeat;
};
struct
Student //声明一个结构体类型 struct Student
{ int num;
char
name[20];
char
sex;
struct
Date birthday; //成员birthday属于struct Date类型
};
则struct Student
的结构如图所示:
num
name
sex
birthday
month
day
year
注意:上面只是建立了一个结构体类型,但是没有定义变量,其中并没有具体的数据,系统并不分配内存,此时还不能使用。
二、定义结构体类型变量
方法1 先声明结构体类型,在定义该类型的变量
例如:
struct Student student1,student2;
方法2 在声明类型的同时定义变量
例如:
struct
Student
{ int
num;
char
name[20];
char
sex;
struct
Date birthday;
}
student1,student2;
方法3 不指定类型名而直接定义结构体类型变量,此时不能再以此结构体类型定义其他变量,只能使用声 明过的变量。
例如:
struct
{ int
num;
char
name[20];
char
sex;
struct
Date birthday;
}
student1,student2;
注意:
1)结构体类型的内存大小为所有类型成员的内存之和。
2)结构体类型(struct
Student )与结构体变量( student1,student2)并不相同。可以对结构体变量进行赋值、存取和运算,但不能对结构体类型进行这些操作。
3)结构体类型中的成员名可以与程序中的变量名相同,但是二者不能代表同一对象。
三、结构体变量的初始化和引用
1. 在定义结构体变量时对其成员初始化,例如:
struct Student a={.name="xieyi"}; //在成员名前有成员运算符 “ . ”
注释:".name"表示结构体变量 a 中的成员 a.name
。而其他未被初始化的数值型成员被系统初始化为0,字符型成员被初始化为‘\0',指针型成员被初始化为NULL。
2. 结构体变量的引用
引用结构体变量中成员的值,引用方式为 结构体变量名. 成员名 。“ . ”是成员运算符,其优先级最高,可以在程序中把 结构体变量名. 成员名(如student1.
num)作为一个整体来看待,此时其相当于一个变量。
注意:不能通过输出结构体变量名来输出结构体变量所有成员的值,只能对结构体变量中的各个成员分别进行输入和输出。
下面用法不正确:
printf("%s\n",student1);
3. 如果结构体成员本身是一个结构体类型,则要使用若干个成员运算符,一级一级地找到最低一级的成员,只能对最低级成员进行赋值或存取以及运算。
4. 同类的结构体变量可以互相赋值,例如:
student1=student2; //student1和student2已经定义为同类型的结构体变量