1. 枚举
- 前言:常量符号化(可读性更强)
- 用符号而不是具体的数字来表示程序中的数字
- 定义:enum 枚举类型名字{名字0,名字1,…名字n};
- 枚举类型名字:不常用
- 大括号里的名字:常量符号 类型int 默认值从0依次到n
- 实际内部计算:以整数来做内部计算和外部输入输出的
- 作用:自动计数的枚举量(定义枚举类型时最后一个枚举量用作计数)
- 方便遍历所有的枚举量
- 建立一个用枚举量做下标的数组
- 注意
- 声明枚举量的时候可以指定值(没有定义的值在前一个值基础上加一)
- enum COLOR { RED=1, YELLOW, GREEN = 5};//值可以是离散的,可以是自定义的
- 声明枚举量的时候可以指定值(没有定义的值在前一个值基础上加一)
2. 结构(复合数据类型)
2.1结构类型
-
结构类型的声明
struct 结构名{ 类型名 成员变量1; 类型名 成员变量2; 类型名 成员变量3; ... ..........; };//分号切记不能漏
-
结构变量的定义
- 定义结构同时定义结构变量
- 先声明结构,后定义结构变量
- 定义无名结构的同时定义结构变量(不常用)
struct point{ //方法1 int x; int y; }p1,p2;//定义结构的同时定义结构变量 struct point{ //方法2 int x; int y; }; struct point p1,p2;//先声明结构后定义结构变量 struct { //方法3 不常用 int x; int y; }p1,p2;//定义无名结构的同时定义结构变量
注意:通常结构定义在函数外部,与函数同等地位,不依赖于任何的函数
- 结构的初始化
struct T 结构变量名 = {
成员变量1的值,成员变量2的值,...,成员变量n的值};//一一对应赋值
struct T 结构变量名 = {
.成员变量1=值,.成员变量2=值,...,.成员变量3=值};//可以缺省某个成员变量的值,缺省值默认为0
-
结构运算
- 强制类型转换成某个结构类型再复制给结构变量
-
结构指针
- p->month 等价于 (*p).month
用**->表示指针所指的结构变量**中的成员
-
注意
- 结构变量名并不代表结构变量的地址,必须使用&运算符才能获取结构变量的地址
2.2结构与函数
-
结构作为函数的参数 (传值)
- 整个结构作为参数的值传入函数
- 在函数内新建一个结构变量,并复制调用者的结构的值
P.S:数组类型作参数时,传进去的是数组变量的地址
-
输入结构(如何利用一个函数输入结构变量的值?)
- 方案1(临时结构变量)
- 在输入函数中定义一个临时的结构变量
- 把整个临时的结构变量的值返回给调用者
struct point inputPoint() { struct point temp;//定义一个临时结构变量 scanf("%d",&temp.x); scanf("%d",&temp.y); return temp; } void main( ) { struct point y = { 0, 0}; y = inputPoint( ); }
- 方案2(结构指针)——重要
- 在输入函数中定义一个临时的结构变量
- 把整个临时的结构变量的值返回给调用者
struct point{ int x; int y; }; struct point* inputPoint(struct point *p) { scanf("%d",&(p->x));//取出p所指的结构变量中成员的地址 scanf("%d",&p->y);//由于->运算优先级高于&,所以该写法与上等价 return p; //返回传入的指针可后续链接其他操作 } void printpoint(const struct point *p){ printf("%d,%d",p->x,p->y); } int main() { struct point y = { 0, 0}; printpoint(inputPoint(&y));//赋值的同时可以同时输出结果 return 0; }
- 方案1(临时结构变量)
方案 | 优点 | 缺点 |
---|---|---|
方案1 | 简单易懂 | 占用大量的内存空间 |
方案2(重点掌握) | 传入传出只是一个指针的大小 | 需理解指针 |
2.3结构中的结构
- 嵌套的结构(注意下面四种等价形式)
注意:p->成员变量的p必须是指针,否则不行(具体如下)
struct pt {
int x;
int y;
};
struct rectangle {
struct point pt1;
struct point pt2;
};
struct rectangle r, *rp;
rp = &r;
那么下面的四种形式是等价的:
r.pt1.x
rp->pt1.x //rp指向的结构变量(rp)的成员变量
(r.pt1).x //点运算符自左往右,有无括号意义相同
(rp->pt1).x
但是没有rp->pt1->x (因为pt1不是指针)//注意
3. 联合
3.1自定义数据类型 Typedef
- typedef orgin_type rename_type
- 声明一个已有的数据类型的新名字
typedef long int64_t;
typedef struct ADate {
int month;
int day;
int year;
} Date;//将struct AData重载名字为 Data
或
typedef struct AData Data;
int64_t i = 100000000000;
Date d = {
9, 1, 2005};
3.2联合
- 联合类型的定义(与结构类型类似)
- 联合类型的赋值(与结构类型类似)
union AnElt {
int i;
char c;
} elt1, elt2;
elt1.i = 4;
elt2.c = ’a’;
elt2.i = 0xDEADBEEF;
注意:
-
存储
-
所有成员共占一个存储空间
-
同一时间只有一个成员有效
-
union的大小是其最大的成员
sizeof(union …) = max{sizeof(成员1),sizeof(成员2),…,sizeof(成员n)}
-
-
初始化(易混淆——与结构类型不同)
- 对第一个成员做初始化(非一一赋值)
-
作用
- 可利用union对整数(int/float)内部字节进行操作