结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构体。
在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。
结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
C 数组允许定义可存储相同类型数据项的变量,结构体是 C 编程中另一种用户自定义的可用的数据类型,它允许你存储不同类型的数据项。
结构体用于表示一条记录,假设你想要跟踪图书馆中书本的动态,你可能需要跟踪每本书的下列属性:
Title
Author
Subject
Book ID
为了定义结构体,你必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
struct [结构体名]
{
//成员列表
类型标识符
成员名;//成员类型可以是基本型或构造型
类型标识符 成员名;
············
};
//注意不要忘记这里的 ;
其中,struct 是定义结构体类型的关键字,定义结构体必不可少;结构体名符合标识符的命名规则,其次结构体名命名有意义。
struct 结构体名:表示一种结构体类型。
1. 结构体类型定义完成,系统不会为其分配内存空间,仅仅只是构造出了一种类型,如果要使用该类型则需要定义该类型的变量。
2. 结构体类型的数据支持嵌套,但是要在嵌套之前完成被嵌套结构体类型的定义。
3. 在定义结构体类型的时候,结构体外面的大括号不能省略。
4. 构造的类型一般放在全局,也就是在头文件与主函数之间,类型定义的位置跟变量定义的位置类似具有全局和局部的效果,也就是说具有作用域。
//申明一个结构体
struct book
{
char title[MAXTITL];//一个字符串表示的titile 题目;
char author[MAXAUTL];//一个字符串表示的author作者;
float value;//一个浮点型表示的value价格;
};
//注意分号不能少,这也相当于一条语句;
这个声明描述了一个由两个字符数组和一个float变量组成的结构体,但是注意,他并没有创建一个实际的数据对象,而是描述了一个组成这类对象的元素,【因此,我们也有时候将结构体声明叫做模板,因为它勾勒出数据该如何存储,并没有实例化数据对象】。
之前我们结构体类型的定义(结构体的声明)只是告诉编译器该如何表示数据,但是它没有让计算机为其分配空间。
我们要使用结构体,那么就需要创建变量,也就是结构体变量,结构体变量的定义有三种方式。
//此声明声明了拥有3个成员的结构体,两个数组成员一个实型成员
//同时又声明了结构体变量s1,s2
//这个结构体有结构体名
struct Book
{
char title[MAXTITL];
char author[MAXAUTL];
float value;
}s1,s2; //可以定义多个变量,变量之间用逗号隔开,也可以使用该类型在需要的定义再次定义变量
struct Book s3;
//此声明声明了拥有3个成员的结构体,两个数组成员一个实型成员
//同时又声明了结构体变量library
//这个结构体并没有标明其结构体名
struct
{
char title[MAXTITL];
char author[MAXAUTL];
float value;}library;
//注意这里不再是定义声明结构体类型,而是直接创建结构体变量了,这个编译器会分配内存的;
//这样的确可以省略标识符也就是结构体名,但是只能使用一次;因为这是;声明结构体的过程和定义结构体变//量的过程合在了一起;并且个成员变量没有初始化的;
//如果你想多次使用一个结构体模块,这样子是行不通的;
//此声明声明了拥有3个成员的结构体,两个数组成员一个实型成员
//这个结构体有结构体名,但没有声明变量
struct Book
{
char title[MAXTITL];
char author[MAXAUTL];
float value;};
//定义好结构体类型之后,在后面定义结构体类型的变量
struct Book s3;
其中,在定义结构体类型变量的时候,可以使用typedef关键字对定义的结构体类型进行重新命名,如下:
用typedef定义新类型名来代替已有类型名,即给已有类型重新命名;
一般格式为;typedef 已有类型新类型名;
typedef int Elem;
typedef struct{ int date;
.....
.....
}STUDENT;
STUDENT stu1,stu2;
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。如下为结构体类型的嵌套。
struct BIR
{
int year;
int month;
};
struct STU
{
int num;
char name[15] ;
int score[2];
struct BIR t;
};