- 结构体
- 什么是结构体
- 结构体创建
- 关于结构体
- 结构体访问
- 结构体对齐
- 位段
- 枚举
- 共用体
C 语言允许用户自己指定这样一种数据结构,它由不同类型的数据组合成一个整体,以便引用,这些组合在一个整体中的数据是互相联系的,这样的数据结构称为结构体,它相当于其它高级语言中记录。
声明一个结构休类型的一般形式如下:
struct 结构体名
{
成员列表
};
结构体创建
用作结构体类型的标志,它又称 结构体标记,大括号内是该结构体中的各个成员,由它们组成一个结构体,对各成员都应进行类型声明如:
struct 结构体名
{
//类型名 成员名;
int a;
char c;
};
- 先声明结构体类型再定义变量名
如上面已定义了一个结构体类型 struct student,可以用它来定义变量。如:
struct student{ //结构体类型名
...
...
...
}student1, student2 //结构体变量名
定义了 student1, student2 为 struct student 类型的变量。
应当注意,将一个变量定义为标准类型(基本数据类型)与定义为结构体类型不同之处在于后者不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型(例如 struct student 类型),因为可以定义出许多种具体的结构体类型。而在定义变量为整形时,只需指定为 int 型即可。
- 直接定义结构类型变量
struct
{
成员表列
}变量名表列;`
不建议这样声明结构体,因为这种声明极其容易与其他结构体混淆,且无法在函数内部创建结构体
关于结构体- 类型与变量是不同的概念,不是混同,只能对变量赋值,存取或运算,而不能对一个类型赋值,存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。
- 对结构体中的成员(即 域)可以单元使用,它的作用与地位相当于普通变量。
- 成员也可以是一个结构体变量。如:
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;
结构体访问
·操作符用于结构体,箭头操作符用于访问结构体地址的成员
第一种,通过结构体指针访问成员
printf("%sn",ps->a);
第二种,直接通过结构体访问
printf("%sn",s.a);
结构体对齐
结构体存在对齐
例如:
struct pc // 声明一个结构体类型
{
char c;
int a;
}
这个结构体大小是8个字节。
其根本原因是大部分环境访问结构体时,通常会以4个字节或者8个字节为单位进行访问,如果不进行对齐,使用结构体内部数据时很可能会出现偏差,如果出现偏差,结构体还需要二次访问来精准的获取数据,所以结构体通过对齐的方式,以空间换时间,来保证能够更快的获取正确的数据。
因此,在定义结构体的时候,建议将较小的数据放在一起,以节省空间。
默认对齐数是由编译器决定的,比如vs是8.
对齐书为一个结构体成员的字节大小与默认对齐数之间较小的那个。
当然,你也可以自定义默认对齐数
使用#pragma pack()预处理指令
#pragma pack (4);//将默认对齐数修改为4 。。。 。。。 #pragma pack();//将默认对齐数还原为原默认对齐数位段
位段的声明与结构体是类似的,只有两点不同:
-
位段的成员必须是整型或字符型
-
位段的成员名后面有一个冒号和一个数字,其意义是对于该成员指定其大小为X个比特位
如:
struct A
{
int a:4;//四个比特位
int b:10;//十个比特位
int c:20;//二十个比特位
};
位段的大小计算和结构体类似,每次分配一个字节。
不足则放弃余下的比特位,再分配一个字节
与结构体一样,在定义位段的时候,建议将较小的数据放在一起,以节省空间。
PS:位段与结构体相比,可以节省时间,但是跨平台型比较差。
枚举枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。
枚举语法定义格式为:
enum 枚举名 {
枚举元素1,
枚举元素2,
……
};
第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。
部分情况下,我们通过使用枚举来代替宏定义
例如如下情况
#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7
enum DAY
{
MON=1,
TUE,
WED,
THU,
FRI,
SAT,
SUN
};
这两种效果是一样的,但是枚举更方便。
枚举的定义与结构体相同
- 先定义枚举类型,再定义枚举变量
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
- 定义枚举类型的同时定义枚举变量
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
- 省略枚举名称,直接定义枚举变量
enum
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
PS:枚举在switch语句中非常好用
共用体共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
定义共用体
为了定义共用体,您必须使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:
union a
{
int a;
char b;
...
} ;
共用体的顾名思义,其成员所占空间是共用的,上面所举的例子,其共用体大小是4个字节,更改a变量,b变量的空间也会随之更改,更改b变量也是一样。
这种特性可以用来检验大小端。
共用体的其他特性与结构体相似。比如创建等等。



