结构体对齐方式:
char a;
double dx;//dx[10] 80 82
char chb;
字节数为:16 //88
结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍。
结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型的所占的字节数的整数倍。
结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节”的整数倍。
假设是从0地址开始
结构体和联合体
结构体中的各个成员都有自己的内存空间。(字节对齐)
数据类型不占字节
typedef struct ListNode
{
struct stu //结构体类型 不占字节
{
int a;
};
int b; 总字节为4
}
typedef struct ListNode
{
struct
{
int a;
}stu;
int b; 总字节为8
}
typedef struct ListNode
{
struct stu
{
int a;
}stu;
int b; 总字节为8 (变量有 stu和 b)
}
typedef struct ListNode
{
struct
{
int a;
};
int b; 总字节为8
}
联合体
联合体的各成员共享同一片内存空间。
其内存大小等于成员中占最大内存空间的大小
指针的解析能力和他的数据类型相同
union Node
{
char a;
char b; // unsigned char ch[2]; 不是数组。
//a, b用的同一片空间 &x.a和&x.b相同
short sx;
};
哑元结构
开辟的空间分为初始化区
和未初始化区
可以设计无名的结构体
也可以设计无名的联合体
union Node
{
struct //哑元结构
{
char a;
char b;
};
short sx;
};
struct Node
{
char ch; //1字节
union //4字节 //如果是union AF{}; 就不行了 就不是哑原结构了 总字节数就变为1 (因为不再是Node的成员,是一个类型)
{
int a;
float b;
}; //共8字节
};
- 变化形式:
struct Node
{
char ch; //1字节
union
{
int a;
float b;
}AF; //共8字节 //Node中由变量 ch和AF
};
struct Node
{
char ch; //1字节
union AF //联合体类型 不占字节
{
int a;
float b;
}; //共1字节
};
int main()
{
struct Node s;
Node::AF x;
}
struct Node
{
char ch; //1字节
typedef union
{
int a;
float b;
}AF; //类型成员不会分配空间
};
//总大小为1字节
sprintf_s
float ft = 12.25f;
sprintf_s(buff, 20, "%f", ft);
//可以把任意的浮点型转化为字符串。
fprintf(stdout, "ft = %f", ft); //对sprintf_s转换后的数据进行输出