结构体数组
首先明确,结构体是一种构造的数据类型,是一种由多个数据类型如 int,char,double,数组或者结构体......组成的类型,如今告诉你们如何定义一个结构体。在定义int整型变量时,你们确定都知道 int a; 即定义了一个int 型变量,系统会自动分配 存int这么大的空间,可是对于结构体而言,它是由许多个不肯定的类型组成的,因此在定义它的时候须要指明它是由哪些数据类型组成的.定义格式有多种,此处只说一种较为简单的,定义格式以下.函数
struct 名字 { 由哪些数据类型组成 };//注意末尾的分号必定要有
例如:我要定义一个学生,学生须要值得注意的属性都有什么呢? 假设须要统计这名学生的 1学号,2姓名,3性别,4班级,5电话,6期末成绩,此时为了简洁且处理方便,就须要用到结构体spa
struct student //结构体名 { long long number,tel; // 学号和电话 int score; //成绩 char name[20],sex[4],clas[20]; //姓名,性别和班级 };
如上,就成功定义了一个关于学生信息的结构体,下面实现具体的输入输出操做code
#include<stdio.h> struct student { long long number,tel; // 学号和电话 int score; //成绩 char name[20],sex[4],clas[20]; //姓名,性别和班级 }; int main() { struct student tiantian; //声明了一个名为tiantian的变量,声明能够与定义同时进行 //如今能够输入 scanf("%lld%s%s%s%lld%d",&tiantian.number,tiantian.name,tiantian.sex,tiantian.clas,&tiantian.tel,&tiantian.score); //输出 printf("%lld %s %s %s %lld %d",tiantian.number,tiantian.name,tiantian.sex,tiantian.clas,tiantian.tel,tiantian.score); return 0; }
运行结果:blog
或许在看了上面的以后,你会想,这也太麻烦了吧,我随便定义6个独立的变量,把它输入再输出出来,这样效果是同样的,并且代码也会简洁不少,不用在用每一个变量时都再前面加上声明结构体时声明的变量。对于上面这个这样想固然没错,不过我如今要说,请统计一下全班全部的人他们各自的 1学号,2姓名,3性别,4班级,5电话,6期末成绩,这时就能体会到结构体的做用之大了,具体看下面的代码。io
#include<stdio.h> struct student //结构体名,定义 { long long number,tel; // 学号和电话 int score; //成绩 char name[20],sex[4],clas[20]; //姓名,性别和班级 }; int main() { //假设此班的学生低于100名,声明了一个名为stu的数组变量, //数组中的每个元素均可以存放下一个学生的六个信息 struct student stu[100]; int i; //输入,,用循环,j假设有续名学生 for(i=0;i<5;i++) scanf("%lld%s%s%s%lld%d",&stu[i].number,stu[i].name,stu[i].sex,stu[i].clas,&stu[i].tel,&stu[i].score); //输出 for(i=0;i<5;i++) printf("%lld %s %s %s %lld %d\n",stu[i].number,stu[i].name,stu[i].sex,stu[i].clas,stu[i].tel,stu[i].score); return 0; }
运行结果:class
观察上面的结果,输入了五组数据,按下回车,输出存储在数组中的结果,每一个学生一行,每一个学生的信息之间空一格。当数字较小的时候或许还看不出优点,但是若是当记录的学生数据达到上千组,无疑,用结构体记录学生数据是较好的方案。变量
好比我要在上述结构体中再添加一个信息,学生的出生年月日,此时应该怎么作呢? date
能够用到结构体的嵌套,在c语言中,许多的东西都是能够嵌套的。修改上述结构体的定义可得:循环
#include<stdio.h> struct date //表示日期的结构体 { int year,month,day; }; struct student //结构体名,定义 { long long number,tel; // 学号和电话 int score; //成绩 char name[20],sex[4],clas[20]; //姓名,性别和班级 struct date bri_day; //将上面的表达日期的结构体套到学生结构体中表达学生的出生年月日 }; int main() { struct student stu[100]; //声明 //内容 }
由上面的变化能够发现有一个问题,访问年月日的时候怎么办呢?固然也是层层访问,如访问学生的出生年,就应该是:stu[i].bri_day.year;另外能够看到我在主函数里面即main()
里面只申明了student结构体,并无声明 date结构体,那么是否是就不用声明date结构体呢?确定不是的,注意..在student结构体的内部,我已经进行了date结构体的声明,且声明变量为bri_day.
固然,与结构体相似的类型还有共用体union和枚举型enum,用法都大同小异,理解告终构体以后再看看他们就是小case了。