<C - 结构体联合枚举> 2017-12-02
01、结构体
/* 递归 函数指针 指针函数 结构体 struct 数组 多个相同类型 的数据 学生 性别(字符) 年龄(int) 名字(char数组) 学号 ID 结构体 存放多个不同类型的数据 1.结构体定义 定义类型 struct 2.定义结构体变量 使用里面的成员 .点运算符 ->箭头运算符(指针) 结构体.成员 结构体指针->成员 3.位域 用法 主要节约内存 类型 成员名 : 分配位数; //int char long unsigned 4.结构体对齐 对齐 计算机运算比较方便 -->可能浪费一点空间 用最大数据的内存单元作为对齐长度 数组算单个元素 0长位域 没有长度的位域 无名位域 换一行 int :0; 联合 枚举 */ #include<stdio.h> #include<graphics.h> #include<string.h> #include<iostream> #pragma pack(5) //设置对齐单元(一般不会用到) //1.定义结构体类型 (重点1) struct student { //结构体成员 char sex; char name[10]; char : 0;//无名位域 char stuNum[10]; char ID[10]; int age; }; typedef struct student STU; //============类型定义======================== //在定义结构体类型的时候同时定义结构体变量 struct A { int age; }Tom, Jhonson = {13};//定义时候同时赋值 全局变量 // ////取别名 //typedef int INT;//给int取一个别名INT //INT num; // //typedef long long LL; //LL ld; typedef struct teacher//(重点方式2) { char sex; int age; char name[10]; char stuNum[10]; char ID[10]; }TEA,John;//定义的时候同时给它取别名 //TEA 相当于 struct teacher TEA ziHuaiHuai; //=============位域========================== //真假 1位二进制 计算机 最小单位 字节 //条件1 条件2 条件3 条件4 真和假 struct Judge { char a:1;//存放条件1的真和假 char b:1;//存放条件2的真和假 char c:1; char d:1; }; //=======全局变量==== //======函数声明===== int main() { printf("%d", sizeof(struct student)); getchar(); struct student ouguang;//定义结构体变量 //写.c文件的时候 不能省略struct ouguang.sex = 'M';//使用成员 //ouguang.name = { "hello" };//strcpy scanf strcmp //单独赋值字符数组 只能用函数或循环 不能用=直接赋值 struct student BUG = { 'M', 19, "bug", "10", "19" };//定义的时候同时赋值 struct student stu[2] = { { 'M', 19, "大炮", "10", "19" }, { 'M', 19, "danny", "10", "19" } };//结构体数组 struct student*p;//结构体指针 p = &ouguang;//赋值结构体地址 //(*p).sex = 'M'; p->sex = 'M';//通过指针访问结构体 stu[0].sex = 'M'; STU piKaJi;//用别名定义 ouguang = BUG;//同类型的结构体可以相互赋值 strcpy(ouguang.name, BUG.name); //ziHuaiHuai = BUG;//结构体成员一样 但是不算一个类型 //MOUSEMSG msg; //msg = GetMouseMsg();//用函数赋值 getchar(); return 0; }
2、联合枚举
/* 1.结构体 同时存放多个数据 炕 你可以睡我可以睡 可以一起睡 联合 一个床 你睡 我就不能睡 关键字 union 同时只能存放一个成员 用法和结构体类似 成员 共用内存 最大一个成员大小 作为联合的大小 联合体变量不能直接初始化 枚举 enum //switch case */ #include<stdio.h> #include<conio.h> union teacher { int age;//年级 char sex;//性别 float height;//身高 double weight;//体重 }; enum week { Mon,Tue,Wen,Thur,Fri,Sat,Sun//写上你要枚举的常量 }; enum dir { up=72,down=80,left=75,right=77 }; int main() { //week today; //today =(enum week)2; //today = Mon; //switch (today) //{ //case Mon: // break; //case Tue: // break; //case Wen: // break; //case Thur: // break; //case Fri: // break; //case Sat: // break; //case Sun: // break; //default: // break; //} int ch= getch(); switch (ch) { case 224: { ch = getch(); switch (ch) { case up: break; case down: break; case left: break; case right: break; default: break; } } } union teacher ou;//定义一个联合体变量 ou.sex = 'M'; printf("性别%c\n", ou.sex); ou.age = 13; ou.weight = 33.3; printf("打印性别%c\n", ou.sex); printf("打印年纪%d\n", ou.age); printf("打印体重%lf\n", ou.weight); printf("联合大小%d", sizeof(ou)); getchar(); return 0; } /* 1.定义结构体类型 存放人的信息 包含电话号码 年纪 身高 体重 名字 输入数据 并且 打印出来 2.选做题 用枚举改写推箱子的按键操作 */
03、位域
#include<stdio.h> #if 0//不用位域 struct A { char a; char b; char c; char d; }; #else//使用位域 struct A { char a : 1;//位域 char b : 2; char c : 2; char d : 1; }; //美国人 姜国人 #endif int main() { struct A PAO; if (3 > 4){ PAO.a = 1; } else PAO.a = 0; if (5 > 67){ PAO.b = 1; } else PAO.b = 0; if (5 > 4){ PAO.c = 1; } else PAO.c = 0; if (4 > 6){ PAO.d = 1; } else PAO.d = 0; //0010-->4个char-->4个字节 printf("%d%d%d%d\n", PAO.a, PAO.b, PAO.c, PAO.d); printf("A占了%d个字节", sizeof(PAO)); getchar(); return 0; } // 一位 2个数字 -1 0 //八位二进制 1000 0000 100000 特殊 -128 //换成2位 00 01 0和1 11 -1 -2 10 //有符号整型 2^8个数据 一半负数 一半非负数 //1位 2个数据 一个负数 -1 一个0