1、结构体 struct
(1)结构体的创建
如同自定义函数一样,数据类型也可以自定义。
结构体变量和结构体指针变量的的创建的时候不要忘记前面的struct
结构体变量也可以在声明的时候直接创建
#include <stdio.h>
//结构体的声明
struct STUDENT
{
char name[30];
int age;
double score;
}s2;
int main()
{
//按成员顺序初始化
struct STUDENT s1 = {"zhangsan", 18, 66.6};
//指定顺序初始化
s2 = {.age = 20,.name = "lisi", .score = 88.8};
//调用结构体内部成员的时候用 “.”操作符,结构体指针用 “->”
printf("%s\n", s1.name);
struct STUDENT* ps2 = &s2;
printf("%d\n", ps2->age);
return 0;
}
(2)typedef重命名结构体
重命名之后的结构体名字放在 ‘ } ’ 和 ‘ ; ’ 之间,重命名之后就可以省略struct了
typedef struct STUDENT
{
char name[30];
int age;
double score;
}STU;
int main()
{
STU s1 = {"zhangsan", 18, 66.6};
SUT* ps1 = &s1;
return 0;
}
(3)结构体大小
先引入对齐数的概念:
- 对齐数就是编译器默认的对齐数与该成员变量大小的较小值
- 在vs里默认对齐数是8,可以使用#pragma预处理指令更改默认对齐数。
- 在结构体里一个结构体成员就有一个对齐数。
为什么要有对齐数?
- 对齐数就是要让对应的数据在它的对齐数整数倍的位置开始存储
- 如int类型的数据,存储开始的位置都是4的整数倍字节处,方便读取。char类型就是1的整数倍。
结构体大小:
- 第一个成员在结构体起始位置
- 其他成员对齐到它对齐数整数倍的位置处
- 结构体大小为所有成员最大对齐数的整数倍
struct S1
{
char c1;
int i;
char c2;
}; //大小为12字节
struct S2
{
char c1;
char c2;
int i;
}; //大小为8字节
2、联合体 union
(1)联合体定义
联合体和结构体格式基本一样。
但联合体的成员变量共享同一块内存空间,对一个成员变量的修改会影响到其他成员变量。
union UN
{
char c;
int i;
};

(2)联合体大小
- 联合体大小至少是最大成员的大小。
- 当最大成员的大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
union STUDNET
{
char name[20];
int age;
double scoure;
}; //大小为24个字节
(3)使用联合体
联合体节省空间
struct gift_list
{
int stock_number; //库存量
double prince ; //定价
int item_type; //商品类型
union //匿名联合体,只用一次
{
//匿名结构体
struct
{
char title[20]; //书名
char author[20]; //作者
int num_Pages; //页数
}book;
struct
{
char design[30]; //设计
}mug;
struct
{
char design[30]; //设计
int colors; //颜色
int sizes //尺寸
}shirt;
}item;
};
联合体判断机器大小端
#include <stdio.h>
int check_sys()
{
union
{
int i;
char c;
}un;
un.i = 1;
return un.c;
}
int main()
{
//1是小端,0是大端
printf("%d\n", check_sys());
return 0;
}
830

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



