结构体类型
struct Student是结构体的类型,stu 就是用这个类型定义的一个结构体变量。就像用 int 类型定义一个 num 变量一样。
struct Student {
int id;
char name[10];
};
int main() {
struct Student stu = { 10, "zhangsan" };
// 不能使用大括号这样的方式赋值
return 0;
}
这个类型名字太长了,不方便使用啊~
别着急,使用typedef重命名类型。
typedef struct Student Student;
这样就可以将那个长长的类型名简化,当然,这两段代码也可以写在一块。
typedef struct Student {
int id;
char name[10];
}Student;
C语言中,结构体可以是匿名的,但是没什么用!
结构体内存对齐
结构体变量在内存中是如何排列的?
- 结构体的第一个成员在与结构体变量偏移量为0的地方。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数=编译器默认的对齐数和该成员自身类型大小的较小值。
可通过== #pragma pack== 预处理指令来修改对齐数。 - 结构体总大小为最大对齐数的整数倍。
- 如果还嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有(含嵌套结构体的对齐数)最大对齐数的整数倍。
结构体实现位段
位段的声明和结构体是类似的,但是有以下不同:
- 位段的成员必须是 int, unsigned int.
- 位段大的成员名后面有一个冒号和一个数字。
联合(共用体)
联合类型的成员公共一块内存空间,所以又叫共用体。
union Un {
char a;
int b;
};
a和b存放在同一块内存空间上,修改a或者b都会影响到另一个成员。