结构体是个啥???

        一、结构体介绍

        结构体是一种自定义的数据类型。和C语⾔已经提供了内置类型,如:char、short、in、float等等类似,只是结构体结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。简单来说,当我们要来描述一个学生时,需要定义名字,身高,体重,性别,成绩等等,那单单使用int类型就定义不了名字这些,而使用char类型又定义不了身高,体重这些,而我们就可以根据需要在结构体定一多种类型定义不同类型的数据,结构体就是解决这个问题的,可以让我们自己创造合适的类型已适用不同场景。

        二、结构体的声明

struct Name
{
      成员列表;
} 变量列表 ;
        创建结构体是需要关键字 struct 后面加上结构体的名称(自定义) ,然后接个{ }, 里面一个或有多个成员列表 括号后面可以有变量也可以没有 但必须有;
eg: 一个学生有名字,成绩,学号,年龄的信息。
struct Student
{
    
char name[20];  //名字
    float score;  //分数
    int id;  //学号
    int age;  //年龄

} stu1 ;  // 创造struct Student类型的变量stu1,和 int a类似(创造int类型的变量a)
int main()
{
    struct Student stu1 = { "李四",95.5,10,21 };//对stu1赋值
    printf("%s %.2f %d %d\n", stu1
. name, stu1 . score, stu1 . id, stu1 . age); //将信息打印出来
    return 0;
}
         在打印信息的时候用到了点操作符,结构体成员的直接访问是通过点操作符(.)访问的          
上述代码结果:
这样就描述了一位名字叫李四,分数为95.5,学号为10,年龄为21的学生。
        三、结构体内存对齐
        我们知道char类型占1个字节,short类型占2个字节,int类型和float类型占4个字节,double类型和long long类型占8个字节,那一个结构体占多少个字节?
        再来看一个例子:
#include<stdio.h>
struct s1
{
    int a;
    char b;
    char c;
};
struct s2
{
    char b;
    int a;
    char c;
};
int main()
{
    printf("%zd\n", sizeof(struct s1));
    printf("%zd\n", sizeof(struct s2));
    return 0;
}
上述代码结果:
可以看得出来结构体s1 和s2 里面的的成员列表一样,只是顺序不一样,可为什么计算出来的内存大小不一样?这就要说到 结构体内存对齐。
        对齐规则:
1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
  对⻬数 = 编译器默认的⼀个对齐数与该成员变量⼤⼩的 较小值
VS 中默认的值为 8
Linux中 gcc 没有默认对⻬数,对⻬数就是成员自身的大小  
eg: 在VS中的 int  a;由于int类型占 4 个字节,VS中默认的值为 8 ,所以int   a的对齐数为 4
3.结构体总大小为最大对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最大的)的
整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最⼤对齐数的整数倍处,结构
体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对⻬数)的整数倍
        当我们创建一个结构体变量s1时内存会开辟一块空间来存放s1的数据,如下图:
结构体s2的内存计算如下图:
注:图中 3.下面有误,是在s2中的最大对齐数为 int a 的4,而不是s1,红色字体是结构体s2的内存大小为12个字节,而不是s1
那如果结构体里面有定义结构体类型,该如何计算
eg:
#include<stdio.h>
struct s2
{
    char b;
    int a;
    char c;
};
struct s3
{
    int a;
    struct s2 b;
    char c;
};
int main()
{
    printf("%zd\n", sizeof(struct s3));
    return 0;
}
上述代码结果如下:
结构体s3的内存计算如下图:
  • 45
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Milliliter___

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值