内置类型-c语言自己的数据类型
- char
- long
- short
- int
- float
- double
复杂对象,复杂类型,
自定义类型: 结构体,枚举,联合体
结构体
- 结构体类型的声明
- 结构体的自引用
- 结构体变量的定义和初始化
- 结构体内存对齐
- 结构体传参
- 结构体实现位段(位段的填充&可移植性)
枚举
- 枚举类型的定义
- 枚举的优点
- 枚举的使用
联合
- 联合类型的定义
- 联合的特点
- 联合大小的计算
结构体
结构体的声明
结构的基础知识:结构是一些值的集合,这些值称位成员变量,结构的每个成员可以是不同类型变量
结构的声明
struct tag
{
member-list; //成员列表
}; variable - list; //变量列表
声明一个结构体类型
声明一个学生类型,是想过学生类型来创建学生变量(对象)
描述学生:属性+名字+电话+性别+年龄
声明了一个结构体类型,里面的东西叫做结构体变量
struct stu //struct结构体关键字 str结构体标签 结构体类型struct stu
{
char name[20];//姓名
char tele[12];//电话
char sex[10]; //性别
int age; //年龄
}s3,s4,s5;
//s3 s4 s5都是用struct stu的类型创建了全局变量可以创建一个或者多个变量
//这里的s3,s4,s5都是局部变量
struct stu s3;//这的s3也是全局变量
int main()
{
//创建结构体变量 s1和s2都是局部变量
struct stu s1;
struct stu s2;
return 0;
}
结构体自引用
在结构体中包含一个类型为该结构本身的成员
结构体自引用正确方式
struct Node
{
int data;
struct Node* next;
};
typedef struct Node
{
int data;
struct Node* next;
}Node;
结构体变量的定义和初始化
有了结构体类型,那如何定义变量,其实很简单
struct point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct point p2 //定义结构体变量p2
struct T
{
double weight;
short age;
};
struct S
{
char c;
struct T st;
int a;
double d;
char arr[20];
};
int main()
{
struct S s = {
'c', {
55.6,30},100,3.14,"helloworld" };
printf("%c %d %lf %s\n", s.c, s.a, s.d, s.arr);
printf("%lf\n", s.st.weight);
printf("%d\n", s.st.age);
return 0;
}
结构体内存对齐
结构体内存大小计算规则
首先掌握结构体的对齐规则:
1.第一个成员在与结构体变量偏移量为0的地址处
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
对齐数 = 编译器默认的一个对齐数与该成员大小的较小值
vs中对齐数默认的值是8其他编译器,各自不一样
3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
实例
struct S1
{
char c1;
int a;
char c2;
};
struct S2
{
char c3;
char c4;
int a2;
};
int main()
{
struct