#include<stdio.h>
#include<stdlib.h>
//自定义类型
//1.结构体
//2.枚举
//3.共用体
//1.结构体
//1.声明 :
//struct A {
// int a;
// int b;
// double c;
//};
//记住不能忘记后边";"
//变量的定义
//struct A b;
//这里的struct A 是一个类型名 在c++中可以直接A b 然而C语言并不支持如想使用可以这样子:
//typedef struct A A;
//A c;
//结构体不可以定义自己类型的变量,不然就会进入无限的递归
//struct B {
// struct B c;
//};
//这样子是不允许的
//结构体不能定义自己类型的变量但是却可以定义自己类型的指针,重要的数据结构如:链表,树就是这样来操作的
//struct s {
// int a;
// char b;
// struct s* s;
//};
//这样子是绝对允许的
//3.结构体的初始化
//typedef struct s {
// int a;
// char b;
// short arr[10];
//}S;
//S s = { 10,10,{0} };这样子是可以的
//s={20,2,{10}};//这样子是不可以的
//***结构体的内存对齐
//三条规则:
//1.第一个变量在与结构体变量偏移量为0的位置处
//2.其他的变量要对齐到某个数字(对其数字)的整数倍地址处
//对齐数的计算::对齐数==系统的默认数字的对齐数和这个数字的最小值
//VS里边的对齐数是8当然可以通过#pragma pack()括号里边填入参数的方式来进行修改
//注意linex的对齐数绝不是4 (优快云)上是错的!!!
//3.结构体的总大小为最大对齐数的整数倍
//4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
//存在最大对齐的原因
//1.平台原因::不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
//2.性能原因:: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对于对齐的内存,处理器只需要一次即可完成访问
struct S1
{
char c1;
int i;
char c2;
};
//内存分布:1代表占有2代表浪费的内存
//1222 1111 1222
//12
struct S2
{
double d;
char c;
int i;
};
//1111 1111 1222 1111
//16
struct S3
{
char c1;
struct S2 s;
double d;
};
//1222 1111 1111 1111 1222 1111 1111 2222
//32
//默认参数是可以修改的
//方法:: #pragma pack
//位段
//位段的类型必须是int unsigned int signed int
//位断的后边有一个冒号和一个数字
//比如 signed int a:1//表示a只占一个比特位,记住是一个比特位而绝非一个字节
struct A {
int _a : 4;
int _b : 11;
int _c : 20;
int _d : 30;
}A;
//按照比特位来写 1代表占有 2代表浪费
//11112222 11111112 11111111 11111111 11112222 11111111 11111111 11111111 11222222 22222222 22222222 22222222
//联合体
//枚举
enum Sex {
male,
female,
othersex
};
//共用体
union MyUnion
{
int a;
char c;
};//所有变量共用痛一块内存
int main()
{
printf("%d\n", sizeof(struct S1));
printf("%d\n", sizeof(struct S2));
printf("%d\n", sizeof(struct S3));
printf("%d\n", sizeof(struct A));
enum Sex sex;//枚举变量和枚举常量不同,切记!!!
sex = 5;
printf("%d\n", sex);//本来不应该通过,但是由于C语言是弱语言,就很烦
sex = male;
printf("%d\n", sex);//0
union MyUnion Un;
Un.a = 15;//c的值也发生了改变,因为他们共用同一块内存
printf("%d\n", Un.c);//15
return 0;
}
自定义类型
最新推荐文章于 2022-10-29 18:20:27 发布
1018

被折叠的 条评论
为什么被折叠?



