#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
//void* my_memcpy(void* dest, const void* src, int num)
//{
// void* ret = dest;
// assert(dest != NULL);
// assert(dest != NULL);
// while (num--)
// {
// *(char*)dest = *(char*)src;
// (char*)dest+1;//??
// (char*)src+1;//??
// }
// return ret;
//}
//memcpy 只要处理不重叠的内存拷贝就可以
//memmove 处理内存重叠的情况
//memcmp 内存比较;
//memset 内存设置;
//int main()
//{
// int arr1[] = { 1,2,3,4,5 };
// int arr2[5] = { 0 };
// my_memcpy(arr2, arr1, sizeof(arr1));//结果不对
// return 0;
//}
//设计结构体时应尽量让占用空间小的成员集中在一起。
//struct S1
//{
// char a;
// int b;
// char c;
//};
//struct S2
//{
// char a;
// char b;
// int c;
//};
//int main()
//{
// printf("%d\n", sizeof(S1));//12
// printf("%d\n", sizeof(S2));//8
//}
//设置默认对齐数4
//#pragma pack(4)
//struct S
//{
// char a;
// double b;
//};
//#pragma pack()
//取消默认对齐数的设置;
//位段
//成员是整形,成员名后面有一个冒号和数字,数字代表的是比特位;
//开辟的空间是成员类型的整数倍;
//为了节省空间。
//struct A
//{
// int a : 2;
// int b : 5;
// int c : 10;
// int d : 30;
//};
//int main()
//{
// struct A a;
// printf("%d\n", sizeof(a));//8
// return 0;
//}
//offsetof(宏 ) 求的是偏差值
#include<stddef.h>
//struct S
//{
// char a;
// int b;
// double c;
//};
//int main()
//{
// printf("%d\n", offsetof(struct S, a));//0
// printf("%d\n", offsetof(struct S, b));//4
// printf("%d\n", offsetof(struct S, c));//8
// return 0;
//}
//枚举
// 枚举的优点
// 1:增加了代码的可读性和可维护性
// 2:和#define定义的标识符比较有类型检查,更加严谨。
// 3:防止了命名重复(封装)
// 4:便于调试
// 5:使用方便,可以一次定义多个变量;
//enum sex//枚举类型
//{
// //枚举的可能取值--枚举常量.默认从0开始。也可以在枚举中赋初始值。
// male = 2,//0
// female = 4,//1
// secret = 6//2
//};
//
//int main()
//{
// enum sex s = male;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
// s = female;
// return 0;
//}
//联合体--成员共用一块空间
//union un
//{
// char c;
// int i;
//};
//
//int main()
//{
// union un u;
// printf("%d\n", sizeof(u));//4
// printf("%p\n", &u);
// printf("%p\n", &(u.c));
// printf("%p\n", &(u.i));//地址是一样的,c和i共用一块空间;
// return 0;
//}
//联合体的大小最少是最大成员的大小。
//当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍;
//union un
//{
// int a;//对齐数是4
// char arr[5];//对齐数是1,数组的对齐数算的是元素的对齐数
//};
//int main()
//{
// union un u;
// printf("%d\n", sizeof(u));//8
// return 0;
//}