#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
struct stu1
{
char name[20];
int age;
float weight;
}s1,s2,s3;//一种创建方法,s1,s2,s3是全局变量,在定义结构体的时候直接创建变量
typedef struct stu2
{
char a[10];
int b;
}stu2;//一种创建方法,这样做可以方便以后在创建结构体变量,使用typedef给结构体类型改一改名字
//stu2是改后的名字,以后定义结构体只需要用stu2就行了
struct
{
char a;
int b;
}s4,s5;//匿名结构体,这种创建变量只能在定义结构体的时候创建,因为他没有完整的名字
//常见的几种定义内容类型
struct note
{
int n;
struct note* next;
};//结构体内有指向下一个结构体的指针
struct ss1
{
int n;
struct stu1 arr;
};//结构体内含另一个结构体
/****************************************************/
//计算结构体大小,vs默认对齐数是8
struct a1
{
int a;
char b;
float c;
};//12
// 对齐效果如下,a,b,c,0分别1变量存放占的空间,0代表空,没有占用
//aaaa b000 cccc
struct a2
{
char a;
int b;
char c;
};//12
//a000 bbbb c000
struct a3
{
double a;
char b;
char c;
};//16
//aaaa aaaa b000 c000
struct a4
{
char a;
struct a3 a3;//对齐数按a3里面最大对齐数,不是按整个结构体大小和默认对齐数比,如果是struct a2来那对齐数就是4,结果是24
double c;
};//32
//a000 0000 3333 3333 3333 3333 cccc cccc
//结构体大小遵循对齐原则
//1,结构体的第一个成员永远放在0偏移处
//2,从第二个成员开始以后的每个成员都要对齐到某个对齐数的整数倍处
// 这个对齐数是成员大小和默认对齐数的较小值(vs对齐数是8,gcc没有默认对齐数,所以对齐数就是成员自身大小)
//3,当成员全部存放进去后,结构体大小必须是所有成员对齐数中最大对齐数的整数倍。如果不够则浪费空间补齐
//4,如果嵌套了结构体,嵌套的结构体要对齐到自身成员对齐数中最大对齐数的整数倍处,
// 整个结构体大小必须是最大对齐数的整数倍,最大对齐数包含嵌套结构体中成员的对齐数
//offsetof(typee,nember)这个函数可以用来计算偏移量,需要头文件#include<stddef.h>,
//第一个参数是结构体类型,第二个参数是结构体成员,返回值是一个整形
//直接显示结构体成员在对应哪一个位置开始存放
//#pargama pack(n)用于修改默认对齐数 n代表要设定的对齐数 n为空则还原成默认
//结构体传参,推荐尽量使用指针,节省空间
void fun(const struct stu1* p)
{
}
/**********************************************/
//位段,声明和结构体类似
//不同 1,位段的成员必须是int ,unsigned int||signed int
// 2,位段的成员名字后面有一个冒号和一个数字(代表所需要bit)
struct A
{
int a : 2;//1字节
int b : 5;//1字节
int c : 10;//2字节
int d : 30;//4字节
};
//后面数字代表几个bit,存放字节中时如果不满8个bit还是会再拿一个字节
//枚举
enum Day
{
mon,
a,
b,
c,
};
//枚举一些该结构的可能取值,给枚举类型赋值,只能赋值你里面写的a,b,c,mon,什么的
//枚举可能取值默认是0,往后递增1
//赋值举例:enum Day arr; arr=mon; arr=a;
int main()
{
struct stu1 a;//用第一种创建方法在,main函数内创建结构体变量
strcpy(a.name, "nihao");//第一种赋值方法
printf("%s\n", a.name);
a.age = 11;
a.weight = 60.0;
stu2 b1;//第二种创建方法
b1 = { "asdfegr",12 };//第二种赋值方法
printf("%s\n", b1.a);
printf("%d\n\n", b1.b);
/****************************/
printf("%u\n", sizeof(struct a1));
printf("%u\n", sizeof(struct a2));
printf("%u\n", sizeof(struct a3));
printf("%u\n", sizeof(struct a4));
return 0;
}