前言
1.枚举的概念
有时候,为了代码的可读性,我们会将常量符号化,即用符号而不是具体的数字来表示程序中的数字,比如用red表示1,使人可以迅速的知道这个变量所代表的含义。如
const int red=1;
if(red){printf(“我喜欢红色”)};
一般,我们很容易想到定义独立的const int变量,用来表示常量。如
const int red=1;
const int yellow=2;
但我们可以更加方便一点,用枚举而不是定义独立的conse int变量。如
enum color{red,yellow,green};
枚举是一种用户定义的数据类型,它用关键字enum以如下语法来声明
enum 枚举类型名字{名字0,...,名字n};
事实上,枚举类型名字通常并不真的使用,因为我们要用的是大括号里的名字,我们仅仅使用枚举来声明一些常量。它们就是一种常量符号,它们的类型也只能是int,且值从0依次递增到n。当我们想要一些可以排列起来的常量时,定义枚举的意义就是给了这些常量名字。如
enum colors{red,yellow,green};
像这样,我们就创建了三个常量,red的值是0,yellow是1,green是2.
2.枚举的用法
1.枚举量可以作为值。
枚举类型可以跟上enum作为类型,且传入一个枚举量时,前面的enum不能省。实际上,在C语言内部,enum类型就是int类型,所以我们可以用%d当作整数来输入输出以及内部计算。
2.枚举量的赋值
声明枚举量的时候可以指定值。如
这样声明的话,red并不是0,yellow就会是2,而green是5,中间的第三第四位就会被“跳过”。
3.自动计数
因为枚举会提供一个依次排列的常量数据,所以我们可以在声明的时候,在最后再放一个名字来表示枚举的数量,这样在需要遍历所有的枚举量或者需要建立一个用枚举量做下标的数组的时候就会很方便。
结构体
1.结构类型,变量,运算
1.1 结构体的由来
我们知道,C语言有很多的数据类型,如char,int,float,double等等。在实际问题中,我们有时候会遇到无法用一个量来表示的事物,如时间(小时,分钟,秒),日期(年,月,日),学生体测成绩(身高,体重)等等。又比如一组数据往往有很多种不同的数据类型,比如登记学生的信息,可能需要用到 char型的姓名,int型或 char型的学号,int型的年龄,char型的性别,float型的成绩。在这些情况下,使用基本的数据类型或者数组都显得很困难。
但利用结构体就会简单许多
因为结构体它可以包括若干个“成员”,每个成员的类型可以相同也可以不同,也可以是基本数据类型或者又是一个构造类型。
1.2 声明结构类型
我们可以像这样声明一个结构体。
对于第一种和第三种形式,都声明了结构point。但是第二种形式没有声明point,只是定义了两个变量。
在使用时,如下
struct date{
int month;
int day;
int year;
}
struct date today;
另外,和本地变量一样,在函数内部声明的结构类型只能在函数内部使用。所以通常我们会在函数外部声明结构类型,这样就可以被多个函数所使用了。如
1.3 结构的初始化
我么可以这样给结构体赋值。
struct date today={10,27,2022};
struct date thismonth={.month=10,.year=2022};
在第一种情况下,today里的三个变量(month,day,year)都有赋值,而在第二种情况下,day并没有被赋值,则会默认为0。
1.4 结构变量
结构体里的常量,被称作成员。我们可以用运算符.和名字访问其成员。如
today.day
student.firstName
p1.x
p1.y
成员变量可以是相同类型,也可以是不同类型。
1.5 结构运算
要访问整个结构,可以用运算符.和结构变量的名字。
而对于整个结构,可以做赋值,取地址,也可以传递给函数参数。如
和数组不同,结构变量的名字并不是结构变量的地址,必须使用&运算符。如
struct date *pDate=&today;
2.结构与函数
2.1 结构作为函数参数
整个结构可以作为参数的值传入函数,与一般的本地变量类似,这时候是在函数内新建了一个结构变量,并复制了调用者的结构的值,即“传值”,这与数组的“传地址”不同。另外,在返回函数的时候,也可以传回一个结构。
2.2 输入结构
我们没有直接的方式可以一次scanf一个结构。我们需要一个函数来输入我们的结构。
但因为和本地变量类似,我们无法直接从一个函数传一个结构进入另一个函数。所以我们可以用结构指针作为参数。
这时我们用->表示指针所指的结构变量中的成员。如
3.结构中的结构
和数组类似,我们可以声明一个结构数组,如
struct dte dates[100];
struct date dates[]{{4,5,2005},{2,4,2005}};
此时,代表一个数组里面的单元是结构类型。
也可以使结构里面的成员是结构。如
struct dateAndTime{
struct date sdate;
struct time stime;
}
而此时,若要访问结构里的成员,有