结构体
首先明确,结构体是一种构造的数据类型,是一种由多个数据类型如 int,char,double,数组或者结构体......组成的类型,现在告诉大家如何定义一个结构体。在定义int整型变量时,大家肯定都知道 int a; 即定义了一个int 型变量,系统会自动分配 存int这么大的空间,但是对于结构体而言,它是由许多个不确定的类型组成的,所以在定义它的时候需要指明它是由哪些数据类型组成的.定义格式有多种,此处只说一种较为简单的,定义格式如下.
struct 名字 { 由哪些数据类型组成 };//注意末尾的分号一定要有
例如:我要定义一个学生,学生需要值得注意的属性都有什么呢? 假设需要统计这名学生的 1学号,2姓名,3性别,4班级,5电话,6期末成绩,此时为了简洁且处理方便,就需要用到结构体
struct student //结构体名 { long long number,tel; // 学号和电话 int score; //成绩 char name[20],sex[4],clas[20]; //姓名,性别和班级 };
如上,就成功定义了一个关于学生信息的结构体,下面实现具体的输入输出操作
#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; }
运行结果:
或许在看了上面的之后,你会想,这也太麻烦了吧,我随便定义6个独立的变量,把它输入再输出出来,这样效果是一样的,而且代码也会简洁很多,不用在用每个变量时都再前面加上声明结构体时声明的变量。对于上面这个这样想当然没错,不过我现在要说,请统计一下全班所有的人他们各自的 1学号,2姓名,3性别,4班级,5电话,6期末成绩,这时就能体会到结构体的作用之大了,具体看下面的代码。
#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; }
运行结果:
观察上面的结果,输入了五组数据,按下回车,输出存储在数组中的结果,每个学生一行,每个学生的信息之间空一格。当数字较小的时候或许还看不出优势,可是如果当记录的学生数据达到上千组,无疑,用结构体记录学生数据是较好的方案。
比如我要在上述结构体中再添加一个信息,学生的出生年月日,此时应该怎么做呢?
可以用到结构体的嵌套,在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了。