结构体(struct)是由一系列相同类型或者不同类型的数据构成的数据集合,也叫结构。结构也是一种数据类型,可以使用结构变量,因此,与其他类型的变量一样,在使用结构变量时要先对其定义。
定义结构变量的一般格式为:
struct 结构名
{
数据类型 变量名;
数据类型 变量名;
...
}结构体变量;
结构名是结构的标识符不是变量名。构成结构的每一个类型变量称为结构成员,它像数组的元素一样,但数组中元素是以下标来访问,而结构是按变量名字来访问成员的。
1.具体定义结构体变量如下:
struct string
{
char name[8];
int age;
char sex[2];
}person;
这个例子定义了一个结构名为string的结构变量person,如果省略变量名person,则变成对结构体的说明。用已说明的结构名也可以定义结构变量。如下:
struct string
{
char name[8];
int age;
char sex[2];
};
struct string person;
如果需要定义多个具有相同形式的结构体变量时用这种方法比较方便,它先作结构说明,再用结构名来定义变量。如:
struct string lilei,wangyi,...;
如果省略结构名,则称之为无名结构,这种情况常常出现在函数内部,如:
struct
{
char name[8];
int age;
char sex[2];
}lilei,wangyi;
2.结构变量的使用
结构体是一个新的数据类型,因此结构变量也可以像其它的变量一样赋值、运算,不同的是结构变量以成员作为基本变量。结构成员的表示方式为:
结构体变量.成员名
如果将“结构体变量.成员名”看成一个整体,则这个整体的数据类型与结构中该成员的数据类型相同,和基本变量一样使用。
3.结构数组和结构指针
一、结构数组
结构数组就是就有相同结构类型的变量集合。假设要定义一个班级40个同学的姓名、性别、年龄和住址,可以定义成一个结构数组。如下:
struct string
{
char name[8];
char sex[2];
int age;
char addr[40];
}student[40];
需要指出的是结构体数组成员的访问是以数组元素为结构体变量,其形式为:
结构数组元素.成员名
例如:
student[0].name
实际上结构体数组相当于一个二维构造,第一维是结构体数组元素,每一个元素是一个结构体变量,第二维是结构成员。
二、结构体指针
结构体指针是指向结构体的指针。它由一个加在结构变量名前的“*”操作符来定义,如:
struct string
{
char name[8];
char sex[2];
int age;
char addr[40];
}*student;
使用结构体指针对结构成员的访问,与结构变量对结构成员的访问在表达方式上有所不同。结构体指针对结构体成员的访问表示为:
结构指针名->结构成员
4.位域的定义和使用
一、位域的声明和结构体声明相仿,其形式为:
struct 位域结构体名
{
位域列表
};
其中位域列表的形式为:类型说明符 位域名:位域长度
例如:
struct bs
{
uint8 a:8;
uint8 b:2
uint8 c:6;
};
注意:
1、一个位域必须存储在同一个字节,不能跨两个字节。如一个字节所剩空间不够放另一个位域时,应从下一个单元起存放位域。也可以有意使某位域从下一单元开始。如:
struct bs
{
uint8 a:4;
uint8 0; //空域
uint8 b:4; //从下一个单元开始存放
uint8 c:4;
};
2.由于位域不许跨两个字节,因此位域的长度不能大于一个字节的长度。
3.位域可以无位域名,这时它只用来作填充或调整位置。无名的位域不能使用。如:
struct k
{
uint8 a:1;
uint8 :2; //该2位不能使用
uint8 b:3;
uint8 c:2;
};