1.枚举
常量符号化
- 用符号而不是具体的数字来表示程序中的数字
const int red=0;
const int yellow=1;
const int green=2;
- 枚举
enum COLOR{RED,YELLOW,GREEN};
枚举
- 一种用户定义的数据类型,用关键字enum以如下语法来声明
enum 枚举类型名{名字0…名字n}; - 枚举类型名字不太真的使用,大括号内的名字是真正要用的,类型是int,值依次从0到n。
- 需要排起来的常量值时使用
- 枚举量可以作为值
- 枚举类型可以跟上enum作为类型
- 但是实际上是以整数来做内部计算和外部输入输出的。
#include<stdio.h>
enum color{red,yellow,green};
void f(enum color c);
int main(void)
{
enum color t=red;
scanf("%d",&t);
f(t);
return 0;
}
void f(enum color c)
{
printf("%d\n",c);
}
- 套路:自动计数的枚举
enum COLOR{RED, YELLOW,GREEN,NumColors};
- 可以指定值
enum COLOR{RED=1,YELLOW/*1+1*/,GREEN=5};
2.结构
- 声明结构类型
...
struct date{
int month;
int day;
int year;
};//声明某种结构类型
...
struct date today;//定义某种结构变量
- 通常声明在函数外,所有函数都可使用
结构的初始化
struct date today={07,31,2014};
struct date thismonth={.month=7,.year=2014};
结构成员
- 结构用.运算符和名字访问成员
- 指针用->访问成员
结构运算
- 访问整个结构直接用结构变量的名字
- 对于整个结构可以赋值、取地址,也可以传递给函数参数
- p1=(struct point){5,10};//相当于p1.x=5,p1.y=10
- p1=p2;//相当于p1.x=p2.x;p1.y=p2.y;
结构指针
- 和数组不同,结构变量名并不是结构变量的地址
- struct date *pDate=&today;
结构作为函数参数
- 可以作为参数传入函数
- 可以作为返回值整体返回
输入结构
注意:不能直接传结构到函数中,函数被释放后结构的赋值会被释放
- 创建一个输入函数返回一个结构变量,赋给main函数中的结构变量
- 直接传结构指针
struct point*getStruct(struct point*);
void output(struct point);
void print(const struct point *p);
int main()
{
struct point y={0,0};
getStruct(&y);
output(y);
output(*getStruct(&y));
print(getStruct(&y));
}
struct point* getStruct(struct point*p)
{
scanf("%d",&p->x);
scanf("%d",&p->y);
printf("%d,%d",p->x,p->y);
return p;//经常通过修改指针并返回结构体来使函数更加通用
}
void output(struct point p)
{
printf("%d,%d",p.x,p.y);
}
void print(const struct point *p)
{
printf("%d, %d",p->x,p->y);
}
结构数组
结构数组初始化
struct date dates[100];
struct date dates[]={{4,5,2005},{2,4,2005}};
结构中的结构
struct point{
int x;
int y;
};
struct rectangle{
struct point pt1;
struct point pt2;
};
struct rectangle r,*rp;
rp=&r;
以下几种表达方式等价
r.pt1.x;
rp->pt1.x
(r.pt1).x
(rp->pt1).x
初始化
r={
{{1,2},{3,4}},
{{5,6},{7,8}}
};
类型定义typedef
- typedef用于声明一个已有的数据类型的新名字
- typedef+源类型+新名字
typedef int Length;//Length等价于int
typedef char*Strings[10];//Strings是十个字符串的数组类型
typedef struct node{
int data;
struct node*next;
}aNode;
或
typedef struct node aNode;//这样用aNode就可以代替struct node
联合
union AnElt{
int i;
char c;
}elt1,elt2;
elt1.i=4;
elt2.c='a';
elt2.i=OxDEADBEEF;
存储
- 所有成员共享一块空间
- 同一时间只有一个成员是有效的
- union的大小是其最大的成员
初始化 - 对第一个成员做初始化