一、结构体
结构体将不同类型的数据存放在一起作为一个整体进行处理,使用起来非常方便,下面是结构体声明以及创建的例子
//申明一个结构体类型
struct food
{
char name[64]; //名称
float price; //价格
};
struct food ChineseFood;
1.1 注意事项
struct 声明的位置决定了该结构体的作用域,如果放在任何函数的外面,那么本文件该声明后面所有函数都可以使用;如果声明在某个函数的内部,则只能在该函数内部且在声明之后使用
创建一个结构体变量后,编译器才会为该变量分配内存空间,并且存储空间连续在一起
1.2 初始化
//方法1,只存在于c99,不需要严格按照变量顺序
struct food food1 =
{
.name = "aaa",
.price = 10
};
//方法2
struct food food2 =
{
"bbb",
20
};
1.3 结构体数组
该数组的每个元素都是一个结构体,结构体数组格式:声明变量类型 数组名称[数组长度]
1.4 结构体自引用
结构体自引用可以采用以下方式:
//方法1
struct st
{
struct st *a; //因为指针的长度是确定的
int b;
};
//方法2
typedef struct str1
{
int value;
struct str1 *link;
} st;
1.5 结构体嵌套其它结构体
struct student
{
char name[32];
int age;
int score;
};
struct teacher
{
char name[32];
int age;
student s1;
};
1.6 备注
结构体的使用中,出现非法,一般由于嵌套使用时候,还没有定义结构体名,导致声明的结构体大小无法确定导致——可以使用指针避免
二、联合体
联合体是一种特殊的自定义类型,包含一系列的成员,但是这些成员变量公用同一块空间,也叫共用体
声明类似于结构体
union un
{
char c;
int i;
};
- 遵守结构体对齐的原则,联合体的总字节数要是联合体的元素中的最大对齐数的最小整数倍
#include<stdio.h>
union MemMode
{
int a;
char b;
};
int main()
{
union MemMode memMode;
memMode.a = 0x11223344;
printf("%x\n", memMode.a); //a = 0x11223344
memMode.b = 0x55;
printf("%x\n", memMode.a); //a = 0x11223355 或者 0x55223344(取决于存储模式),联合体最大4字节,a的值被后面共用位置的b的赋值修改
- 利用低地址存放元素,可以通过联合体得出编译器存储方式
#include<stdio.h>
union MemMode
{
int a;
char b;
};
int main()
{
union MemMode memMode;
memMode.a = 0x11223344;
if (memMode.b == 0x11)
{
printf("大端存储\n");
}
else if (memMode.b == 0x44)
{
printf("小端存储\n");
}
}
三、枚举
声明:enum 枚举名 { 元素1, 元素2 };
- 第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1
- 枚举是值类型,直接存储数据,而不是引用,因此无法修改
- 枚举只有一种类型的成员:int整型常量