结构体类型的概念:
结构体是指包含多个单一的数据集合。
C语言中提供了结构体数据类型作为一个集合来处理这种复杂数据,一个结构体可以将多个单一信息结合在一起作为一个整体来使用。使用结构体时,首先要声明需要的结构体类型,一般形式shi :
struct 结构体名{
数据类型1,结构体成员1;
数据类型2,结构体成员2;
数据类型3,结构体成员3;
......
};
结构体名相当于这个结构体的标记,它与标识符struct共同组成这个结构体的名称。每一个结构体可以包含很多成员,每一个成员都有一个数据类型,这些成员可以被声明为除该结构体类型本身外的任意有效数据类型。
定义结构体变量:
声明了结构体类型后,便可以使用该类型来定义结构体变量。C语言中定义结构体变量有三种形式,其实这也是声明结构体类型的三种形式:
1.声明结构体类型,并定义结构体变量;
2.不声明结构体类型,直接定义结构体变量;
3.使用typedef得到简化的结构体类型名,再定义结构体变量。
结构体的字节长度:
一般的系统中,为了寻址的方便,数据在内存中存储时一般以其本身数据类型的字节长度为基本单位对齐。而结构体数据在存储时是以其中字节长度最大的成员的字节数为基本单位对齐的。
结构体中的成员分配的内存空间是相邻的。结构体变量所占得字节空间数,即结构体数据类型的字节长度,一般等于各个结构体成员的字节长度和。
所谓对齐,是指将内存以一个固定的字节数作为最小单位分块,分配内存时只能一块一块地分配。
但是当相邻地结构体成员的字节长度长短不一时,由于内存对齐的影响,会使结构体额外占用一些空间,从而使其内存空间大于各个结构体成员的字节长度总和。
结构体的使用:
访问结构体成员:
使用成员操作符(.)可以访问结构体成员。成员操作符是一个二元操作符,前面的操作符为结构体变量,后面的操作符为结构体成员名。标准形式如下:
结构体名.结构体成员名;
只能通过直接访问结构体成员的方式来实现对成员的访问。
初始化结构体变量:
使用结构体变量和其他类型变量一样,在使用前最好对其初始化。为结构体初始化的方法与数组初始化类似,可以使用一个数值序列依次为结构体成员赋值。
结构体数组:
结构体数组就是以结构体类型为数组元素的数组。
定义结构体数组:
与定义结构体变量的方式相对应,定义结构体数组的方法有三种:
1.声明结构体类型,并定义结构体数组:
可以声明一个结构体类型后,再使用结构体类型来定义结构体数组。
2.不声明结构体类型,直接定义结构体数组:也可以直接定义结构体数组。
3.使用typedef:还可以先使用typedef来得到结构体类型的别名,再使用该别名来定义结构体数组。
结构体指针:
指向结构体变量的指针:定义一个指向结构体变量的指针与定义一个指向其他类型变量的指针方法基本一样。
一般的结构体变量只能使用成员操作符来得到成员,而结构体指针则可以通过箭头操作符来获得成员。
指向堆空间的结构体指针:
可以定义一个结构体指针变量并将其指向从堆上分配的内存空间。
指向结构体数组元素的指针:
将一个结构体数组元素的地址赋值给一个指针变量,便可以获得一个指向结构体数组元素的指针变量。如果用来赋值的地址是一个结构体数组的元素,便可以利用该指针变量和相对偏移量的嘴和来访问数组中的各个结构体元素。