枚举
如果程序中需要用到一些固定的数字,这些数字被称为 magic number,这些数字经常用字符来替代。
比如,定义颜色:
const int red = 0;
const int yellow = 0;
const int green = 0;
更好的方式是使用枚举类型来定义,取代上面分别独立的const int 变量。
enum COLOR{RED, YELLOW, GREEN};//RED=0,YELLOW=1,GREEN=2
enum COLOR作为一个类型声明的前缀:
enum COLOR t;//t就是一个枚举类型变量,类型是enum COLOR,在C语言中,enum不可以省略。
枚举,只能是int ,枚举量默认从0开始,也可以指定枚举类型里面每一个量的值大小。
(C语言里的枚举类型很少用,因为不好用)
结构
struct 关键字{}后面要有分号;
//声明一个结构:
//第一种方式:
struct date{
int month;
int day;
int year;
};
//第二种方式:
struct {
int month;
int day;
int year;
}today;//定义一个结构,这个结构没有名字,但是有一个名为today的变量。
//第三种方式就是混合和前两种方式,既有结构名,也有变量名。
struct date today;//定义一个名为today的date类型结构变量。
today = (struct date){12,05,2015};//初始化today
today = {.month = 12, .year = 2015};//这样也是可以的。
today.month = 12;//这样也可以。
today1 = today2;//结构可以直接互相赋值,数组不可以这样。
数组变量名就是变量地址,但是结构不是这样,必须使用&才能取到地址值。
结构变量在函数内作为参数传递时,传递的是值,不是变量,也就是说,在函数内新建了一个结构变量。
->符号:指针所指的结构变量中的成员
struct date *p = &today;
(*p).month = 12;
p->month = 12;//这两句是等价的。
//->指向符号只能用在结构指针的后面。
数组类型也可以是自定义的结构类型:
struct date today[2] = {{12,05,2015},{10,01,2016}};//定义一个date结构类型的数组。
today[0].day = 5;//用索引号和点来引用数组里面某个结构的成员变量。
联合
typedef
typedef:自定义数据类型
typedef int Length;//length 就成了int的别名。
typedef struct ADate{
int month;
int day;
int year;
} Date;
//Date 就代表了typedef 和Date之间的那些东西。
Date a = {12, 5, 2015};//使用typedef后,这一句相当于下面那句。即,以后,不用每次声明一个新的结构变量的时候都带着 struct。
struct ADate a = {12, 5, 2015};
union
union Test{
int i;
char c;
} test1, test2;
sizeof(union Test);//结果是sizeof(每一个成员)的最大值。
//对union来说,所有成员变量使用同一个内存空间。
//同一时间只有一个成员是有效的。