目录
🍈🍈👀前言
🍈🍈结构体类型
🍈🍈结构体的声明
🍈🍈结构体的自引用
🍈🍈结构体的访问
🍈🍈结构体的传参
🍈🍈传结构体
🍈🍈传地址
🍈🍈结构体的内存对齐
🍈🍈位段
🍈🍈位段的声明
🍈🍈位段的内存管理
🍈🍈位段的跨平台性
🍈🍈 枚举类型
🍈🍈枚举类型的定义
🍈🍈枚举类型的优点
🍈🍈联合体类型
🍈🍈联合体的定义
🍈🍈联合体的特点
📢结构体类型
struct tag //这里的struct是结构体的关键字,tag是结构体标签,也就是结构体的名称
{
number - list; //结构体成员列表
}veriable-list; //结构体的变量
📢结构体的声明
如果结构体的标签是student,我拿student来举例子
结构体的完整声明
struct Student
{
char name[20];//姓名
char sex;//性别
int age;//年龄
int num;//学号
}; //这里的分号不能丢
结构体的不完全声明(匿名结构体类型)
struct
{
int a;
char b;
double c;
}s; //这s不能省略
📢结构体变量的定义与初始化
结构体的定义大致分为三种情况
📢注意:结构体初始化与数组相同,都必须整体进行赋值。
📢结构体的自引用
struct Node //初始话链表
{
int a;
struct Node next;
};
struct Node //初始话链表
{
int a;
struct Node* next;
};
故就可以通过指针来访问每一个结点
📢结构体的访问
(1)通过结构体变量进行访问:
printf("%s\n",s.name);
(2)通过结构体指针进行访问:
printf("%s\n",ps->name);
📢结构体的传参
📢结构体的内存对齐(强烈建议观看)
在另外一篇文章详细讲过——【C语言系列】-结构体中的内存对齐
📢位段
可能有人没有听过什么是位段
位段的结构类型跟结构体有些类似可以类似结构体去学习
也可以说
位段是结构体特殊的实现
📢位段的声明
相较于结构体,位段的声明有两点不同
<1>规定位段的成员的必须是int,unsigned int ,signed int (但是写成char类型也没什么大的问题)
<2>位段的成员后面有一个冒号和一个数字
struct A //位段的声明
{
int _a : 2;
int _b : 5;
int _c : 10;
int _d : 30;
};
📢位段的内存管理
#include<stdio.h>
struct A
{
int a : 2;
int b : 5;
int c : 10;
int d : 30;
};
int main()
{
printf("大小是%d字节", sizeof(struct A));
return 0;
}
📢位段的应用
📢位段的跨平台性
📢枚举类型
枚举类型适用于可以一一列举的类型
比如说星期、性别
📢枚举类型的定义
enum Day //星期
{
//枚举的可能取值
Mon,
Tues,
Wed,
Thir,
Fri,
Sta,
Sun
};
enum Sex //性别
{
MALE,//0
FEMALE,//1
SECRET//2
};
枚举类型是有初始值的
如果你没赋予它初始值,就会默认从零开始,依次加一
📢枚举类型赋予初始值
#include<stdio.h>
enum Sex //性别
{
MALE = 4,
FEMALE=10,
SECRET//
};
main()
{
printf("%d %d %d", MALE,FEMALE,SECRET);
return 0;
}
可以看到,其实默认的值是可以改的
当某个成员被赋予某个值的时候,后续的成员就在此基础上加一
📢枚举类型的优点
📢联合体类型
📢联合体的定义
union Un
{
int a;
char b;
};
union是联合体关键字,Un是联合体的标签
📢联合体的特点
共用体,顾名思义,这里的共用就是公用内存
内存的也可被折叠
#include<stdio.h>
union Un
{
char c;
int i;
};
int main()
{
union Un u = {0};
printf("%d\n", sizeof(u));
printf("%p\n", &u);
printf("%p\n", &(u.c));
printf("%p\n", &(u.i));
return 0;
}
他们有相同的地址
c和i存放在同一块内存空间上,修改c或者i都会影响到另一个成员。
📢联合体内存大小的计算
<1>联合体内存大小是最大成员的大小
<2>最大成员的大小如果不是最大对齐数的整数倍,就会对齐到最大对齐数的整数倍
(联合体也存在内存对齐)
#include<stdio.h>
union Un1
{
char c[5];
int i;
};
//Un1成员最大成员大小5,最大对齐数是4,所以Un1的大小是8;
union Un2
{
char c[7];
int i;
};
//Un2成员最大成员大小7,最大对齐数是4,所以Un2的大小是8;
int main()
{
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
return 0;
}
欢迎点赞收藏加关注,如若有问题可以提出来😁😁😁😁