C语言入门第十七篇,结构体、联合体和枚举

结构体是C语言很重要的概念,他是数据结构的关键。
基本性质
个人理解结构体是一种变量的集合体,他把变量放入了一个结构里面,形成了一个结构体。我们先看看他的基本语法。
struct 结构体名
{
结构体
}
我们看上面的基本语法可以看出,我们需要给出结构体名和内部的结构体就能声明一个结构体变量。上面的语法还不能表现真正结构体的属性,我们来看看一个例子,我们需要定义一个学生的结构体,里面存放学号,姓名,性别。

struct student{
	int num;
	char name[20];
	char sex[10];
}

这只是一个结构体的定义,我们需要使用这个结构体还需要声明一个变量,方法如下:

struct student students;

students就是一个结构体变量。那么怎么使用这个变量呢?如下:

scanf("%d",&students.num);
scanf("%s",students.name);
scanf("%s",students.sex);

上面的代码是我们对学号,姓名,性别进行输入。可以看到我们在结构体中用点(.)来访问结构体中的变量。可是我这样只能输入一个结构体,我有50个学生怎么办?
结构体数组
结构体是一个变量类型,如同整型,浮点型一样,结构体同样也有数组。怎样声明呢?

struct student students[50];

有了结构体数组我们就可以输入50个学生了。这个数组可以像我们之前利用循环进行输入,具体的例子如下:

int i;
for(i=0;i<50;i++){
	scanf("%d",&students[i].num);
	scanf("%s",students[i].name);
	scanf("%s",students[i].sex);
	}

这里深入的讲一下,结构体数组其实是数据结构中的顺序链表,前面就讲过数组是连续的一片内存地址,所以结构体数组在作为链表的时候是连续的一片内存。与之对应的当然是随机的内存地址实现的链表,而这样的链表是利用指针实现的。这些知识如果是小白的话,了解一下就好了,我们后面会仔细的讲他的原理和实现的方法,当然这些本来是数据结构的东西,所以强烈建议大家在看了这个入门后(虽然我不知道什么时候能写完哈哈哈,但是尽量能在这几个月完成这个),去学习数据结构。
结构体指针
刚刚说到链表的另一种实现方法就是结构体指针。这一块就比较复杂了,但是我在前面有足够的铺垫。希望大家这里能够明白,我暂时不讲怎么样实现50个学生的链表,只是介绍一下结构体指针。
结构体指针比结构体数组要复杂一些,因为如果我们声明一个结构体指针的话,他是没有足够大的内存空间的,所以我们需要申请内存(我们在前一章讲过数组申请内存)。我们来看看例子:

//#include<stdlib.h> 上一章忘了说了,申请内存需要stdlib.h这个头文件
struct student *students;
students=(struct student *)malloc(sizeof(struct student));//申请内存
scanf("%d",students->num);
scanf("%s",students->name);
scanf("%s",students->sex);

这里就是结构体指针的使用方法,申请内存的方法其实很简单,前面的(struct student *)是后面申请的内存的类型强制转换成结构体的类型,sizeof()函数就是计算student这个结构体需要多大的内存,最后赋值给students。结构体指针调用自己内部的元素时也不再用.(点)而是->这个符号
联合体
联合体和结构体语法差不多,只是他的关键字是union,struct和union的区别在于,union只使用一块内存。什么意思呢?前面我们看到结构体可以包含很多变量,union也差不多,但是union同时只能使用一个带值变量。如下

union data{
	int i;
	float j;
	char k[10];
}

上面的这个联合体我们只能给其中一个变量赋值,因为他只有一块内存(默认应该是取结构体占用内存最大的那个变量的大小,作为联合体的内存大小,这个例子应该是k[10]这个数组的内存大小)。
联合体我就不在细讲了,主要的用法就是用联合体来表示一个状态,例如:我写的一个程序有一个字段是来表示编码的格式,因为编码只可能是一种格式,而我们可以用union写很多格式的变量,但是用的时候只能用一个。
枚举
这里再讲一下枚举这个类型,也类似上面结构体和联合体,枚举类声明过后会自带自己的值,并且一直递增上去。举个例子:

enum week{MON,TUE,WED,THU,FRI,SAT,SUN};

申明一个枚举变量和结构体差不多

enum week day;

这里可以让枚举变量day等于枚举里面的任意一个值,例如day=MON,就是day=0,day=THU,就是day=3,依次递增。
如果在什么的时候对枚举的值进行了赋值是什么情况呢?

enum week{MON,TUE=2,WED,THU,FRI,SAT,SUN};

那么MON=0,TUE=2,WED=3,THU=4……

总结
本篇介绍了结构体、联合体和枚举这三种变量的内容,他们只是一个变量的类型,我们需要掌握他的声明和调用方式。还要熟悉结构体数组和结构体指针这两个结构体以后会常常用到的东西。联合体的话我用的比较少,但是还是要会,并且结构和联合都可以嵌套使用(结构体里面再加结构体或结构体里面有联合等等)。枚举的话,我根本没怎么用,但是不能不知道这个类型。
练习
1.能否将我这篇所说的利用结构体数组和我给的零星的代码,写出输入10个学生基本信息(学号,姓名,性别),并输出。
ps:枚举类型,引用了这篇博客的例子枚举用法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章