c语言结构体的简单使用方法

结构体的基本用法

c语言有很多种数据类型来存放各种各样的数据。

比如我们的成绩100分的这个100,我们用名为score的int数据类型来进行存储  int score =100;

大写字母A我们用一个名为level的char类型来进行存储数据 char leve='A';

一个人的名字,我们使用char类型的数组来存储  char name[20]={"Eiop"};

#include <stdio.h>

int main(int argc, char **argv)
{
    int score=100;
    char level='A';
    char name[20]={"Eiop"};

    printf("score=%d\n",score);//score=100
    printf("level=%c\n",level);//level=A
    printf("name=%s",name);//name=Eiop

    return 0;
}

输出的结果是:

score=100

level=A

name=Eiop

我们想打印出一个人的信息,我们就需要 进行三次printf才能把所有信息打印出来,而且一个人的数据都存在三个不同的类型中,如果数量一多,就很乱。那有什么东西可以把一个人的数据都存起来吗?

如果使用数组,那我们只能存储一个类型的多个数据,比如 int score[100];我们可以存入一百个分数,但是与我们的要求并不相同。那么为了达成这种要求,存储一个人的信息,我们就可以使用结构体来进行存储这几种不同类型的数据。

#include <stdio.h>

struct student  //struct +结构体名称
{
    char name[20];
    int score;
    char level;
};

int main(int argc, char **argv)
{
    struct student stu1={"Eiop",100,'A'};  //stu1是结构体变量

    printf("name=%s,score=%d,level=%c",stu1.name,stu1.score,stu1.level);
            //打印结果:name=Eiop,score=100,level=A
    return 0;
}

结构体一般是在头文件下面进行定义。struct + 结构体名称。 我这里是要存储一个学生的信息,所有我把这个结构体取名为student。

这个结构体student有什么作用呢?它可以存放三种不同类型的数据,char name[20] 用来存放学生的名字,int score 用来存放学生的分数 ,char level用来存放学生的等级。

在主函数mian中呢,我们就创建了一个结构体student的变量stu1,用来存放一名学生的信息,并且进行初始化赋值。

如果我们需要添加其他学生

   struct student stu1={"Eiop",100,'A'};
   struct student stu2={"xx",77,'S'};

这就是结构体的基本用法了。

结构体的大小计算

int类型的数据大小是4个字节,char类型大小是1个字写。结构体作为一个存放数据的数据结构,当然也是有大小的,结构体大小的判定还是要看结构体里面需要存放了什么类型的数据,存放了多少来进行判断。

struct fun1
{
    int a;   //4个字节
    char b;  //1个字节
    float c; //4个字节
};

int main(int argc, char **argv)
{
    struct fun1 f1;
    printf("student=%ld",sizeof(f1));
    
    return 0;
}

我们来看一看这个结构体fun1 ,fun1是由一个int类型,一个char类型,一个float类型的数据组成。

可能有人会觉得fun1的大小是由这些相加 :4+1+4 =9

然而 我们打印出来f1的结构大小是:12

我们画一个图片来了解这个原理。

在这个图片中,红色的部分就是int a 占据的4个字节。蓝色部分就是char b占据的一个字节。紫色部分就是float c 占据的4个字节。  红色4+蓝色1+白色3(无数据空间)+紫色4 =12

这些加起来是 就是结构体的大小12。

可能大家还是有很多疑问,我们继续看接下来的图片。

结构体每一行的长度是由你结构体中最大的那个来算的,比如在上个图中,最大的是int a 占据4个字节,所以每行长就是4。  到了这个图,最大的是long e 占据了8个字节,所以每行都是8 。

每行能存有多少个类型的数据是按顺序来的,比如第一行只可以存下int a 和 char b,无法存下 float c ,所以c 只能够到第二行去了。 这就是结构体大小的计算方法。

结构体的大小一定会是其中最大数据类型的倍数。白色的地方就是没用被利用到的内存空间,但是也是被计算在结构体大小里的,这浪费了一些内存空间也是结构体的缺点之一。

结构体数组的使用方法

#include <stdio.h>

struct student
{
    char name[20];
    char sex;
    int height;
    int score;
};


int main(int argc, char **argv)
{
    struct student students[] =
        {
            {"eiop", 'M', 199, 100},
            {"qq", 'W', 188, 11},
            {"zzqd", 'W', 233, 233},
        };

    int rows = sizeof(students) / sizeof(students[0]); // 获取二维数组的行数
     for (int i = 0; i < rows; i++)
    {
        printf("%-9s%-7c%-8d%-5d\n", students[i].name, students[i].sex, students[i].height,students[i].score);
    }

    return 0;
}

  • 35
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值