该文章Github地址:https://github.com/AntonyCheng/c-notes
在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!
结构体:
每个成员都有自己独立的空间;
struct data{
char a;
short b;
int c;
};
画图如下:
| c | c | c | c | b | b | a | (null) |
|---|
共用体(联合体):
所有成员共享同一份空间,空间大小由占内存最大的成员所决定;
union data{
char a;
short b;
int c;
}; //a b c成员共享同一份空间
画图如下:
| c(b)(a) | c(b) | c | c |
|---|
共用体所表示是可以被不断刷新的,它就像是比较万能的一种数据类型,可以同时表示多种基本数据结构,甚至是数组等引用类型:
//普通数据类型
#include
typedef union data{
char a;
short b;
int c;
}DATA;
int main(int argc, char* argv[]) {
DATA data;
printf("sizeof(data) = %d\n", sizeof(data));
data.b = 1;
data.a = 2;
data.c = 4;
printf("%x\n", data);
}
打印效果如下:

//引用数据类型
#include
typedef union data{
char a;
short b;
int c;
int arr[5];
}DATA;
int main(int argc, char* argv[]) {
DATA data;
printf("sizeof(data) = %d\n", sizeof(data));
data.b = 0;
data.a = 0;
data.arr[0] = 3;
data.arr[1] = 2;
data.arr[2] = 1;
data.arr[3] = 1;
data.arr[4] = 2;
printf("%x\n", *data.arr);
}
打印效果如下:

这里打印出来的总大小为data.arr的大小,而取 * 是读取的该地址的首元素,此时就是数组的第一个元素;
**案例:**思考下例打印结果;
#include
typedef union data{
char a;
short b;
int c;
}DATA;
int main(int argc, char* argv[]) {
DATA data;
data.b = 10;
data.a = 20;
data.c = 30;
printf("%u\n", data.a+data.b+data.c);
//由于
}
打印效果如下:

结果不可以看作是最后一次赋值决定了成员的取值,而是因为 30 这个数据太小了,一个字节都能装下,所以最小的一个数据类型 char 都能装下,所以可以被覆盖,具体解释出现在下一小节;
共用体的空间大小由最大的成员决定,共用体虽然共同拥有一份空间,但是从空间读取的字节数是由成员自身类型决定的,即这是一种内存覆盖的提取方法,示例如下:
#include
typedef union data{
char a;
short b;
int c;
}DATA;
int main(int argc, char* argv[]) {
DATA data;
data.c = 0x01020304;
data.b = 0x0102;
data.a = 0x01;
printf("%#x\n", data.a+data.b+data.c);
}
打印效果如下:

从十六进制换算来看,并不是简单的赋值操作,原理如下:
首先我们将三个数按照内存中的排布方式给列出来:
| 0 | 4 | 0 | 3 | 0 | 2 | 0 | 1 |
|---|---|---|---|---|---|---|---|
| 0 | 2 | 0 | 1 | ||||
| 0 | 1 |
按照赋值的顺序依次覆盖内存:
| 0 | 1 | 0 | 1 | 0 | 2 | 0 | 1 |
|---|
然后在这段内存上取值,画图如下:
