结构体
类似于Java中的Bean对象,可以将一些变量封装为一个结构体
声明结构体的关键字是struct
,也可以通过typedef
别名定义
举个栗子:
struct Student
{
//不同的数据类型可以声明在一个结构体中
int age;
short j;
};
int main()
{
//结构体的使用
struct Student student;
student.age = 10;
return 0;
}
还有一种使用结构体的简单方式,在声明结构体后面直接定义,如下:
struct Student
{
int age;
short j;
}student1,student2;//student1和student2就可以直接使用了
下面我们通过printf("结构体大小%d",sizeof(student));
打印一下结构体的大小,控制台输出结果是:
结构体大小8
我们声明的两个变量,一个是int(四个字节),一个是short(两个字节),但是结构体的大小是8个字节;
原因是:在C执行的过程中,给结构体等分配内存的时候遵循内存对齐
原则。
内存对齐
定义:内存对齐跟数据在内存中的位置有关。如果-一个变量的内存地址正好位于它长
度的整数倍,他就被称做自然对齐。比如在32位cpu下, 假设一个整型变量的地址为
0x00000004,那它就是自然对齐的。
内存对齐的原则有两个:
- 结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
- 结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数。
所以上面Student
结构体的short
类型的变量分配了四个字节,只不过后面两个字节是不起作用的。所以整个结构体占用了8个字节
内存对齐的意义如图:
内存对齐共用体
结构体和共用体表示的含义是一致的
1、定义:共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据
类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。
共用体提供了一种使用相同的内存位置的有效方式。
通过union
关键字声明共用体,存放不同的数据类型:
{
int i;
float f;
char str[20];
};
注意:共用体占用的内存应足够存储共用体中最大的成员。例如,在上面的实例中,Data 将占用20个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。下面的实例将显示上面的共用体占用的总内存大小:
举个栗子:
union Student
{
int i;
int j;
float k;
};
int main()
{
union Student student;
student.i = 10;
student.j = 22;
printf("i的地址: %#x\n", &student.i);
printf("j的地址: %#x\n", &student.j);
}
控制台输出结果为:
i的地址: 0x4ffb44
j的地址: 0x4ffb44
我们看到i和j的首地址是一样的,在赋值操作后打印i和j的值
printf("i的值: %d\n", student.i);
printf("j的值: %d\n", student.j);
//输出结果为
//i的值: 22
//j的值: 22
打印一下共用体大小:
printf("共用体大小: %d\n", sizeof(student));
//输出结果
//共用体大小: 4
网友评论