结构体
枚举
枚举是一种用户定义的数据类型,它用关键字enum以如下语法来声明:
enum枚举类型名字(名字0,...,名字n)
枚举类型名字通常并不真的使用,要用的是在大括号里的名字,因为它们就是常量符号,它们的类型是int,值则依次从0到n。如:.
enum colors (red,yellow,green) ;
就创建了三个常量,red的值是0,yellow是1,而green是2。
当需要一些可以排列起来的常量值时,定义枚举的意义就是给了这些常量值名字。
枚举量可以作为值;
枚举类型可以跟上enum作为类型;
但是实际上是以整数来做内部计算和外部输入输出的。
因此有个套路,用枚举进行自动计数
(来自翁恺老师的视频)
这样需要遍历所有的枚举量或者需要建立一个用枚举量做下标的数组的时候就很方便了。
枚举量
声明枚举量的时候可以定值
enum COLOR{RED=1,YELLOW,GREEN=5};
(来自翁恺老师的视频)
枚举的优点
如果有意义上排比的名字,用枚举比const int方便
枚举比宏(macro)好,因为枚举有int类型
结构类型
声明结构类型
(来自翁恺老师的视频)
结构体在函数的内外两种情况的结果和本地变量一样,在函数内部声明的结构类型只能在函数内部使用
所以通常在函数外部声明结构类型,这样就可以被多个函数所使用了
声明结构的形式
第一种
(来自翁恺老师的视频)
第二种
(来自翁恺老师的视频)
第三种
(来自翁恺老师的视频)
对于第一和第三种形式,都声明了结构point,但是第二种形式没有声明point,只是定义了两个变量。
结构成员
结构和数组有点像
数组用[]运算符和下标访问其成员如:
a[0]=10;
结构用 . 运算符和名字访问其成员,如:
today.day
student.firstName
pl.x
pl.y
结构运算
要访问整个结构,直接用结构变量的名字
对于整个结构,可以做赋值、取地址,也可以传递给函数参数
pl=(struct point)(5,10];//相当于pl.x=5;
pl.y=10;
pl=p2; //相当于pl.x=p2.x;pl.y=p2.y;(数组无法做这两种运算)
结构指针
结构指针和数组不同,结构变量的名字并不是结构变量的地址,必须使用&运算符
struct date *pDate = &today;
结构与函数
结构作为函数参数
int number0fDays(struct date d)
整个结构可以作为参数的值传入函数
这时候是在函数内新建一个结构变量,并复制调用者的结构的值
也可以返回一个结构
这与数组完全不同
输入结构
(来自翁恺老师的视频)
如果想要通过结构作为函数参数进行操作上图是无法实现的。因为是值的传递而不是地址变量的传递
如果想通过其他函数的操作对主函数进行更改值,可以使用结构指针
(来自翁恺老师的视频)
因为指针可以直接指向我们想要改变变量的地址。
而(*p).month 等价于p->month,
->的符号表示指针所指的结构变量中的成员
结构中的结构
结构数组
如:如果设一个结构中有三个变量
则struct date dates [100];
struct date dates[]={{4,5,2005},{2,4,2005}};
该例子可以理解为有100个结构并排序,每个结构都有三个变量,然后对于{4,5,2005},这个是作为第一个结构的三个变量的值,之后以此类推。
结构里有结构
(来自翁恺老师的视频)
结构体中的成员可以又是一个结构体,构成结构体的嵌套
结构体不可以嵌套跟自己类型相同的结构体,但可以嵌套定义自己的指针
如果有变量定义:
struct rectangle r.*rp;
rp=&r;
则有四种等价形式的书写
r.ptl.x
rp->ptl.x
(r.ptl).x
(rp->ptl).x
类型定义
自定义数据类型typedef
C语言提供了一个叫做 typedef的功能来声明一个已有的数据类型的新名字。比如:
typedef int Length;
使得 Length成为int类型的别名。
这样:Length这个名字就可以代替int出现在变量定义和参数声明的地方了
Length a,b,len ;
Length numbers[10];
通俗来说如下面的代码
typedef int INTEGER;
INTEGER a, b;
a = 1;
b = 2;
这个代码的意思是 INTEGER a, b;
等效于 int a, b;
或者
typedef struct stu{
char name[20];
int age;
char sex;
} STU;
这个代码的意思是 STU body1,body2; 等价于 struct stu body1, body2;
联合
联合(union)的声明和结构与结构体类似,但是本质不同。
在联合体中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。
所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值
联合变量的声明和结构变量的声明方式相同, 也有三种形式
第一种,先定义联合体类型,再声明联合体变量;
union perdata
{
int class;
char officae[10];
};
union perdata a,b; //说明a,b为perdata类型
第二种,定义联合体类型的同时声明联合体变量;
union perdata
{
int class;
char office[10];
}a,b;
第三种,直接声明联合体(以匿名的形式定义联合体类型)。
union
{
int class;
char office[10];
}a,b
//a,b变量均为perdata类型。a,b变量的长度应等于 perdata 的成员中最长的长度, 即等于office数组的长度,共10个字节。对a,b变量如赋予整型值时,只使用了2个字节,而赋予字符数组时,可用10个字节。