美文网首页
C编程代码

C编程代码

作者: 简洁心飞 | 来源:发表于2019-01-17 14:31 被阅读0次

    C教程

    结构体、结构体变量、结构体数组、结构体指针、枚举、共用体
    
    在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据
    结构体是一种集合,可以包含任意数量、任意类型、的变量/数组/指针
    既然结构体是一种数据类型,可以用它来定义变量
    struct 用来定义C结构体类型
    结构体包含、struct 结构体名{ 结构体成员变量;} 结构体类型变量;
    可以在全局范围中定义定义结构体、创建结构体变量、但不能给结构体成员赋值
    不能在函数外给结构体成员变量赋值、因为结构体是自定义类型、编译器对程序进行编译时,必须先构造或者创建全局变量,为全局变量分配内存,再找入口函数;而在创建全局变量时,该变结构体类型量编译器无法识别,故无法创建该全局变量
    结构体使用点号.获取单个成员  "结构体变量名.成员名;"
    需要注意的是,
    结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;
    结构体变量可能包含实实在在的数据,需要内存空间来存储
    
    
    结构体数组是指数组中的每个元素都是一个结构体。结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、一个车间的职工等。
    结构体指针是指指向一个结构体的指针,定义的形式一般为:struct 结构体名 *变量名;
    结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&
    结构体指针获取结构体成员:"(*pointer).memberName" 或者 "pointer->memberName"
    结构体指针作为函数参数:void average(struct stu *ps, int len);
    
    
    struct stu{
        char *name;   //姓名
        int num;      //学号
        int age;      //年龄
        char group;   //所在学习小组
        float score;  //成绩
    };
    
    可以在定义结构体的同时定义结构体变量
    struct stu{
        char *name;   //姓名
        int num;      //学号
        int age;      //年龄
        char group;   //所在学习小组
        float score;  //成绩
    }stu1, stu2;
    
    // ...
    int main(){
      //给结构体成员赋值
      stu1.name = "Tom";
      stu1.num = 12;
      stu1.age = 18;
      stu1.group = 'A';
      stu1.score = 136.5;
        //读取结构体成员的值
        printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
        return 0;
    }
    
    定义结构体数组和定义结构体变量的方式类似
    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组 
        float score;  //成绩
    }stus[5];
    
    结构体数组在定义的同时也可以初始化
    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组 
        float score;  //成绩
    }stus[5] = {
        {"Li ping", 5, 18, 'C', 145.0},
        {"Zhang ping", 4, 19, 'A', 130.5},
        {"He fang", 1, 18, 'A', 148.5},
        {"Cheng ling", 2, 17, 'F', 139.0},
        {"Wang ming", 3, 17, 'B', 144.5}
    };
    
    当对数组中全部元素赋值时,也可不给出数组长度
    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    }stus[] = {
        {"Li ping", 5, 18, 'C', 145.0},
        {"Zhang ping", 4, 19, 'A', 130.5},
        {"He fang", 1, 18, 'A', 148.5},
        {"Cheng ling", 2, 17, 'F', 139.0},
        {"Wang ming", 3, 17, 'B', 144.5}
    };
    
    定义结构体指针
    #include <stdio.h>
    
    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    } stu1 = { "Tom", 12, 18, 'A', 136.5 };
    //结构体指针
    struct stu *pstu = &stu1;
    int main(){
      printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);
      //Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!
    }
    

    枚举的取值为有限的整数:在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等
    枚举类型的定义形式为:enum typeName{ valueName1, valueName2, valueName3, ...... };
    枚举成员都是全局的不能在定义相同名称变量、
    枚举成员都是常量,不能对它们赋值,只能将它们的值赋给其他的变量
    
    枚举和宏其实非常类似:
    宏在预处理阶段将名字替换成对应的值,
    枚举在编译阶段将名字替换成对应的值。
    我们可以将枚举理解为编译阶段的宏。
    
    enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };  //0-6
    enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };  //1-7
    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };  //1-7
    enum week a, b, c;  //定义枚举变量
    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;  // 定义枚举类型的同时定义变量
    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;  // 定义枚举类型的同时定义变量、并赋值
    
    #include <stdio.h>
    int main(){
        enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;
        scanf("%d", &day);
        switch(day){
            case 1: puts("Monday"); break;
            case 2: puts("Tuesday"); break;
            case 3: puts("Wednesday"); break;
            case 4: puts("Thursday"); break;
            case 5: puts("Friday"); break;
            case 6: puts("Saturday"); break;
            case 7: puts("Sunday"); break;
            default: puts("Error!");
        }
        return 0;
    }
    

    C语言共用体(Union
    union 共用体名{
        成员列表
    };
    结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员
    结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉
    共用体也是一种自定义类型,可以通过它来创建变量
    共用体在一般的编程中应用较少,在单片机中应用较多
    
    union data{
        int n;
        char ch;
        double f;
    };
    union data a, b, c;
    
    可以在定义共用体的同时创建变量
    union data{
        int n;
        char ch;
        double f;
    } a, b, c;
    

    相关文章

      网友评论

          本文标题:C编程代码

          本文链接:https://www.haomeiwen.com/subject/enridqtx.html