一:要想了解这些数据类型,首先我们得知道在c语言中都有哪些数据类型,以及为什么要有数据类型。
1.类型的意义:决定使用这种类型所要开辟内存空间的大小;如何看待这块内存空间。
2.c语言中都有哪些数据类型,如图:
这里我们主要讲结构体、枚举、联合体等自定义数据类型
二:结构体
1.概念:将相同或不同属性的类型数据放在一起。
2.结构体声明:
struct A
{
member-list
}variable-list
3.结构体成员的访问:因为结构体中有不同类型的数据,所以不能像数组那样,用下标来访问。结构体有两种方式来访问成员。
struct B
{
char name[20];
int age;
};
(1).struct B s;定义结构体变量名,用名称+.的方式访问。例:s.name, s.age。
(2).struct B *p;定义结构体指针,用指针+->的方式访问。例:p->name, p->age。
4.结构体变量的定义和初始化:
struct Point
{
int x;
int y;
}s;
struct Point p1;
struct Point p2{2, 4};
注意:结构体允许整体初始化,但不能整体赋值。
5.结构体内存对齐规则:
(1)结构体第一个成员的地址与结构体变量地址再数值上是相同的,偏移量就是成员地址与结构体变量地址的差值。如第一个成员的偏移量为0。
(2)结构体的所有成员都有对齐数(包含第一个成员),该成员的对齐数就是其自身类型大小和该平台对齐数中的较小值。(vs默认为8,Linux默认为4)
(3)成员对齐就是该成员的偏移量能够整除自身对齐数。
(4)结构体总大小为最大对齐数(各成员对齐数中的最大值)的整数倍。
(5)如果嵌套了结构体的情况,将它也看作普通成员,其对齐数为该结构体成员中的最大对齐数。
struct A
{
char a;
int b;
double c;
};
在vs环境下struct A的大小为多少?a的对齐数为1,偏移量为0,它对齐。b的对齐数为4,偏移量为1,所以要空出3个字节它才能对齐,所以它和a占8个字节,c对齐数为8,偏移量为8,所以对齐,结构体大小为16,因为各成员中最大对齐数为c,8字节,能被16整除,所以struct A大小为16字节。
6.结构体传参:结构体传参时,由于性能问题,建议穿结构体的而地址。
三:枚举
1.概念:枚举就是把可能的取值一一列举。(枚举常量默认从整形0开始,一次递增1)
2.定义:
enum Day
{
Mon,
Tues,
Wed
};
3.赋值:在定义的时候可赋初值
enum Day
{
Mon = 1,
Tues = 3,
Wed
};
四:联合
1.概念:这种类型定义的变量也包含一系列成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
2.声明:
union Un
{
char c;
int i;
}un;
union Un un;
3.联合大小的计算:联合与结构体一样也要考虑内存对齐的情况,所以在计算是有以下几点
(1)联合的大小至少是最大成员的大小
(2)当最大成员不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。