1 结构体
结构体可以存储不同的数据类型,定义结构体使用 struct 关键字
结构体变量的定义可以和结构体的声明同时
struct 结构体名 {
//结构体成员
int a;
char b;
float c;
}结构体变量;
结构体名,结构体成员,结构体变量,这三者出现两个即可
1.1 结构体变量的定义放在结构体的声明之后
struct Test {
int a;
char b;
float c;
};
//声明机构体变量test1,使用struct test即可声明其他的变量
struct Test test1;
1.2 匿名结构体定义结构体变量
//声明结构体变量test1,没有结构体名,这样就不能再次定义新的结构体变量了
struct {
int a;
char b;
float c;
}test1;
给结构体成员赋值,用的是“ . ”
test1.a = 3;
2 结构体类型别名
typedef 是用来定义自己习惯的数据类型名称的,简单举例:
下面的定义方式,a和b均是 int 数据类型的
typedef int qiaoint;
int a;
qiaoint b;
在结构体中的使用方式如下
typedef struct {
int a;
char b;
float c;
}Test;
//
Test test1;
3 结构体内存
结构体与数组不同,数组存储的是相同数据类型的数据,而结构体存储的是不同的数据类型,但是,计算机在读取内存时,是按照固定大小进行读取的,
3.1 结构体内存对齐
3.1.1 举例1
#include <stdio.h>
typedef struct {
char a;
int b;
char c;
}Test;
void main()
{
Test test1;
printf("a的地址:%p,b的地址:%p,c的地址:%p\n",&test1.a,&test1.b,&test1.c);
printf("结构体占用内存大小为:%d\n",sizeof(test1));
}
上述代码中,char占一个字节,int占4个字节,总共应该是占用6个字节,实际运行如下,发现char占用4个字节
a的地址:000000000061FE14,b的地址:000000000061FE18,c的地址:000000000061FE1C
结构体占用内存大小为:12
这就是结构体的内存字节对齐,以结构体中内存占用最大的数据类型所占用的字节数为标准,所有的成员在分配内存时都要与这个长度对齐
3.1.2 举例2
#include <stdio.h>
typedef struct {
char a;
char b;
int c;
}Test;
void main()
{
Test test1;
printf("a的地址:%p,b的地址:%p,c的地址:%p\n",&test1.a,&test1.b,&test1.c);
printf("结构体占用内存大小为:%d\n",sizeof(test1));
}
与举例1不同的是,这次是两个占用1字节的char类型数据在前面,此时内存分布为,占用字节共8个
a的地址:000000000061FE18,b的地址:000000000061FE19,c的地址:000000000061FE1C
结构体占用内存大小为:8
3.1.3 举例3
#include <stdio.h>
typedef struct {
char a;
char b;
char c;
char d;
char e;
int f;
}Test;
void main()
{
Test test1;
printf("a的地址:%p,b的地址:%p,c的地址:%p,d的地址:%p,e的地址:%p,f的地址:%p\n",&test1.a,&test1.b,&test1.c,&test1.d,&test1.e,&test1.f);
printf("结构体占用内存大小为:%d\n",sizeof(test1));
内存占用情况
a的地址:000000000061FE14,b的地址:000000000061FE15,c的地址:000000000061FE16,d的地址:000000000061FE17,e的地址:000000000061FE18,f的地址:000000000061FE1C
结构体占用内存大小为:12
3.1.4 总结
- 结构体内存对齐是按最大的字节对齐的
- 一个单元的内存没有用完时,剩下的够下一个数据使用时,是可以继续使用的
- 不足以存放时,会再申请一个单元的内存
- 写结构体的时候,需要按照合理的顺序书写,尽量占用最少的内存