什么是结构体
结构体其实就是一个数据,这个数据是由多个不同数据类型组成的数据
创建结构体
struct 结构体名
{
//数据成员
char name[20];
int age;
int num;
};
//一般结构体是描述一类事物的共同属性(抽象具有公有的特征)
//一般结构体描述一类事物
//结构体类型: struct 结构体名
//struct 结构名等效int 也就是一个数据类型
//C语言的创建变量语法
//类型 变量名;
- 学会创建结构体类型
- 知道结构体类型怎么表达式
- 学会创建结构体变量
- 结构体变量创建并且初始化
- 用{}的数据去初始化
- {}中的数据类型一次要和定义的顺序类型一致
如何访问结构体中的数据
结构体中成员必须要通过结构体变量去访问
- 结构体数组算是多个普通的结构体变量集合
- 结构体指针:指针必须指向了结构体变量
- 变量访问: 变量名.成员访问
- 指针访问: 结构体指针->成员访问
- 在操作结构体中的成员,不需要看前缀,只需要看成员,以前这种数据是怎么操作,现在就怎么操作
创建位段
struct 结构体名
{
类型 变量名:数字;
//......
};
位段的理解
- 数据存储的内存精确到二进制位
- 节省内存
- 嵌入式操作一些特殊器材
- 网络传送特殊数据
#include <stdio.h>
#include <stdlib.h>
struct Flag
{
unsigned char a : 3; //000-111 7
unsigned char b : 1; //0-1
unsigned char c : 3; //000-111
};
int main()
{
struct Flag flag = { 8,1,7 }; //1000
printf("%u\t%u\t%u\n", flag.a, flag.b, flag.c);
printf("%p\n", &flag);
printf("%zd\n", sizeof(flag));
return 0;
}
C语言共用体
联合体也叫做共用体
共用体定义
union 名字
{
//数据成员
};
共用体的理解
- 所有变量使用的内存都是同一块内存,一般是共用体中数据成员占用内存最多的变量内存
- 共用体在使用时候只有一个变量有效,对于初始化不能同时初始化所有变量
#include <stdio.h>
#include <stdlib.h>
union Data
{
int num;
char name[20];
};
int main()
{
//union Data data = { 1,"name" }; //错误写法
union Data data;
data.num = 65;
printf("%s\n", data.name);
printf("sizeof:%d\n", sizeof(union Data));
strcpy_s(data.name, 20, "ABCDEF");
printf("%d\n", data.num);
return 0;
}
C语言枚举类型
枚举类型它是符号整形常量,通常使用枚举类型使用表示一些列具有特殊含义的整数(幻数)
枚举类型的定义
enum 名字{Left,Right,Down,Up};
枚举类型的理解
- 是个整形常量
- 初始化问题
- 默认初始化
- 赋值的初始化
- 默认和赋值的初始化
C语言结构体内存对齐
- 字符可以拆分
- 字符可以和整形变量合并
- 习惯写代码的方式: 一般尽量把大的内存放到后面写
#include <stdio.h>
struct MM
{
char name[20]; //20 16+4
int age; //4 4+上面的:4
double score; //8 8
};
struct Boy
{
char name[20]; //20 16 +4 补4
double score; //8
int age; //4 补4
};
struct Girl
{
char name[5];
int age;
};
struct Data
{
struct Girl girl; //12
struct Boy boy; //40
double info;
struct MM mm; //32
};
struct Test
{
struct Girl girl; //12
double info;
struct Boy boy; //40
struct MM mm; //32
};
union UData
{
char name[19];
double num;
int age;
};
struct Test2
{
struct Girl girl; //12
double info;
struct Boy boy; //40
struct MM mm; //32
union UData data; //24
};
int main()
{
printf("%zd\n", sizeof(struct MM));
printf("%zd\n", sizeof(struct Boy));
printf("%zd\n", sizeof(struct Girl));
printf("%zd\n", sizeof(struct Data));
printf("%zd\n", sizeof(struct Test));
printf("%zd\n", sizeof(union UData));
printf("%zd\n", sizeof(struct Test2));
return 0;
}