结构体的基本用法
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;
}