# 【看课必备】MOOC C语言进阶——翁恺 结构类型笔记

目录

联合（union）

MOOC原视频地址：C语言程序设计进阶_浙江大学_中国大学MOOC(慕课)

## 结构（structure）

### 代码引入：明天是哪一天？

``````typedef struct date {
int years;
int month;
int day;
} DATE;
DATE today, tomorrow;
//下一天是哪天？
#include <stdio.h>
#include <stdbool.h>
int number0fDays(struct date *p);
bool isLeap(struct date *p1);
int main() {
printf("请输入今天的日期：（years mm dd）");
scanf_s("%d %d %d", &today.years, &today.month, &today.day);
if (today.day != number0fDays(&today)) {   //今天不是月末
tomorrow.day = today.day + 1;
tomorrow.month = today.month;
tomorrow.years = today.years;
}
else if (today.month == 12) {    //今天是月末，还是12月。
tomorrow.day = 1;
tomorrow.month = 1;
tomorrow.years = today.years + 1;
}
else {                          //今天是月末。
tomorrow.day = 1;
tomorrow.month = today.month + 1;
tomorrow.years = today.years;
}
printf("明天是：%d-%d-%d", tomorrow.years, tomorrow.month, tomorrow.day);
return 0;
}
int number0fDays(struct date *p) {
int days;
const int daysPerMonth[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
if (p->month == 2 && isLeap(p)) {
days = 29;
}
else days = daysPerMonth[p->month - 1];
return days;
}
bool isLeap(struct date *p1) {
bool leap = false;
if ((p1->years % 4 == 0 && p1->years % 100 != 0) || p1->years % 400 == 0) {
leap == true;
}
return leap;
}``````

### 代码解析

1.首先来看如何写出结构

``````struct date {   //声明结构类型
int day;    //结构成员1
int month;  //结构成员2
int years;  //结构成员3
};     //因为是语句，最后加;结尾
struct date today, tomorrow;  //定义结构变量``````

2.结构初始化与访问结构成员

``````struct date today={2021,12,12};   //结构初始化
struct date today={.year=2021,.month=12,.day=12};  //另一种结构初始化的方式
tomorrow.day = today.day + 1;  //.+名字可以访问结构中的成员
``````

3.几种结构变量的运算

``````today=(struct date){2021,12，5};
today=tomorrow;    //结构中所有的值都传过去了。``````

### 代码拓展延伸

4.结构指针

``````struct date *p=&today;
p->month=12;     //p指向了结构变量today里的成员。``````

5.结构数组

``````struct date today[3] = { {2021,10,12},{2021,12,12},{2021,11,13} };
today[i].month    //取出结构变量today，第i个数组的成员month``````

6.结构里的结构

``````#include <stdio.h>
int main() {
struct point {
int x;
int y;
};
struct rectangle {
struct point pt1;
struct point pt2;
};
struct rectangle r;
struct rectangle* p;
p = &r;   //记得给指针赋值。
r.pt1.x = 1;  //.的左边必须是一个结构。
r.pt2.y = 2;
p->pt2.x = 3;
p->pt1.y = 4;
printf("%d %d %d %d", r.pt1.x,r.pt2.y,p->pt2.x,p->pt1.y);
}``````

## 枚举（enumeration）

``enum color {red yellow green Number};//red=0,yellow=1,green=2，Number=3.``

color称为枚举类型名称，该类型只能是int，分别从0到n。（也可以指定值）

## 类型定义（typedef）

``````typedef int LENTH;  //LENTH成为了int的别名。
LENTH a, b, len;
int x;
int y;
}DATE;
DATE d = { 1,2 };``````

其实就是给变量类型换个名字，方便阅读者理解。

## 联合（union）

``````union AnElt {
int i;
char c[4];
}elt1,elt2;``````

union常用于得到一个int double ......内部的各个字节。（以16进制的形式得到）

union的用法类似于struct，但是 i与c使用的是同一空间。讲到文件时会拓展。

（作者也是一边学习一边分享，如有错误欢迎指出！持续更新中......）

THE END