<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

 

posted @ 2018-01-25 16:20  让优秀成为一种习惯  阅读(186)  评论(0编辑  收藏  举报