1、结构体
结构体是C编程中一种用户自定义的数据类型,类似于Java的JavaBean
内存分配采用 字节对齐 的方式 有一个 预处理其 可以指定 对其的字节数
{ #pragma pack(2) } // 指定以2字节 进行对齐 可以有效的节省存储空间
#include <stdio.h>
// 1、结构体,结构体根据其内部的声明和声明的顺序不同,分配的内存大小也不一样
struct Hello
{
int a;
short b;
short c;
};
// 2、结构体分配的内存是 最大占有字节的变量的 整数倍
// 结果是8字节,是因为两个 short 所占据的字节数合并了。正好等于 一个 int
// 而 hello3 没有挨着, 无法合并
struct Hello2
{
short a;
short b;
int c;
};
// 3、Hello3 是 12 字节,是因为 里面的 int 是 4字节,
// 他需要的内存应该是 int 的整数倍。
// 而两个short 占据的字节数 也是 4个 字节
#pragma pack(2) // 本来是占据 12 个字节,但是加入了 pragma 所以就以2字节进行对齐,占据8字节了
typedef struct majie
{
short a;
int b;
short c;
} Hello3;
#pragma pack()
int main(){
struct Hello h1;
struct Hello2 h2;
// 因为 Hello3 是 typedef 为 majie 的结构体 取的一个新的名字
// 所以 typedef 的 一个作用是 给已有的 结构体 类 数据类型 起 别称
Hello3 h3;
printf("h1 size=%d h2 size=%d h3 size=%d \n",
sizeof(h1), sizeof(h2), sizeof(h3));
return 0;
}
2、共用体
1、共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型
2、具有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
3、其占用的内存的大小是 其中 成员的 数据类型 中所需要的最大的。也就是说 共用体占用的内存应足够存储共用体中最大的成员
4、每次只有一个 可以 赋值
所以共用体的作用就是,当我们需要多个数据类型的时候,但是每个数据类型只有一个在使用,这种情况下,就使用共用体。节省内存,而不是每一个数据类型都要声明。
#include <stdio.h>
#include <string.h>
union Qiao1
{
int a; // 4字节
float c; // 4字节
long b; // 8字节
char d[10]; // 10字节
} data;
int main(){
// 共用体是 共用同一块内存,所以,共用体的数据,是最后一次赋值所决定的
printf("data 共用体的数据大小 size=%d %d\n", sizeof(data), sizeof(data.d));
return 0;
}
结果不太一样,data的大小是16