zoukankan      html  css  js  c++  java
  • C语言基础 (11) 结构体 ,共用体 枚举 typedef

    1 课堂回顾

    作用域与生命周期

    2 static 局部变量

    2 打字游戏

    3 内存分区代码分析

    4 结构体基本操作

    (复合类型[自定义类型

    #include <stdio.h>

    #include <string.h>

     

    // 定义一个结构体类型

    // 1struct是关键字

    // 2struct Student合起来才是结构体类型

    // 3、结构体内部定义的变量不能直接赋值

    // 4、结构体只是一个类型,没有定义变量前,是没有分配空间,没有空间,就不能赋值

     

    struct Student

    {

        int age;

        char name[50];

        int score;

    }; // 有分号

     

    int main(int argc, char *argv[])

    {

        // 定义结构体变量

        // 1、类型名变量名

        struct Student stu; // 别忘了struct关键字

     

        // 1、结构体变量初始化,和数组一样,要使用大括号

        // 2、只有在定义时才能初始化

        struct Student stu2 = {18, "mike", 59};

     

        // 使用结构体成员,不能直接使用,需要借助结构体变量来引用

        struct Student tmp;

     

        // 如果是普通变量,使用. 点运算符

        tmp.age = 18;

        // tmp.name = "mike"; // name成员是数组名,数组名是常量,不能修改

        strcpy(tmp.name, "mike");

        tmp.score = 59;

     

        // 如果是指针变量,使用->

        // 如果是指针,指针有合法指向,才能操作结构体成员

        struct Student *p;

        p = &tmp;

        p->age = 18;

        strcpy(p->name, "mike");

        p->score = 59;

     

        // 任何结构体变量都可用 . ->操作成员

        (&tmp)->age = 18; //操作指针

     

        (*p).age = 18; //操作内存

     

        return 0;

    }

    5 结构体使用画图

    结构体大小可以简单认为是上面几个相加,但是实际上比他们大,因为有一个结构体对齐的问题

    *p等价于p[0]

    // .优先级高,所以*p.age 需要写(*p).age

    06 结构体变量使用补充

    07 结构体数组

    #include <stdio.h>

    #include <string.h>

     

    struct Student

    {

        int age;

        char name[50];

        int score;

    };

     

    int main()

    {

     

        //

     

        struct Student a[5] =

            {

                18, "mike", 59,

                22, "jiang", 66,

                33, "xiaobai", 87,

                29, "lily", 77,

                30, "lucy", 68};

     

        // 求平均分

        int i = 0;

        int n = sizeof(a) / sizeof(a[0]);

        int sum = 0;

     

        for (i = 0; i < n; i++)

        {

            sum += a[i].score;

        }

     

        printf("平均分: %d ",sum/n);

    }

     

    int main01(int argc, char *argv[])

    {

        struct Student s;

        struct Student a[5]; // 结构体数组

     

        // (a+1) 指针

     

        // 第一种写法:操作元素

        a[0].age = 18;

        strcpy(a[0].name, "mike");

        a[0].score = 50;

     

        // 第二种写法:操作某个元素地址

        (a + 1)->age = 19;

        strcpy((a + 1)->name, "jiang");

        (a + 1)->score = 59;

     

        //第三种写法:操作元素

        (*(a + 2)).age = 18;

        strcpy((*(a + 2)).name, "lily");

        (*(a + 2)).score = 59;

     

        struct Student *p = a;

        p = &a[0];

     

        p[3].age = 21;

        strcpy(p[3].name, "xiaoming");

        p[3].score = 62;

     

        (p + 4)->age = 22;

        strcpy((p + 4)->name, "xiaojiang");

        (p + 4)->score = 88;

     

        int i = 0;

        int n = sizeof(a) / sizeof(a[0]);

        for (i = 0; i < n; i++)

        {

            printf("%d, %s, %d ", a[i].age, a[i].name, a[i].score);

        }

     

        return 0;

    }

    08 结构体嵌套

    #include <stdio.h>

    #include <string.h>

    #include <stdlib.h>

     

    struct Info

    {

        int age;

        char name[50];

    };

     

    struct Student

    {

        struct Info info; //结构体嵌套

        int score;

    };

     

    int main(int argc, char const *argv[])

    {

        struct Student s;

     

        s.info.age = 18;

        strcpy(s.info.name, "mike");

        s.score = 59;

     

        struct Student *p = &s;

        p->info.age = 18;

        strcpy(p->info.name, "mike");

        p->score = 59;

     

        struct Student tmp = {18, "mike", 59};

     

        printf("%d, %s, %d ", tmp.info.age, tmp.info.name, tmp.score);

     

        return 0;

    }

     

    9 结构体赋值

    10. 思考题

    11 结构体值传递和地址传递的区别

     

    12 指针指向栈区空间

    13 指针指向堆区空间

    14 非法使用内存导致的错误说明

    15 成员指针指向data区或栈区

    指向data区:

    指向栈区:

    16 成员指针指向堆空间

    17  结构体套一级指针

    struct Student

    {

        int age;

        char *name;

        int score;

    }; // 有分号

     

    int main()

    {

        struct Student *p;

     

        // 需要给p分配内存

        p = (struct Student *)malloc(sizeof(struct Student));

     

        if (p == NULL)

        {

            printf("分配失败 ");

            return 0;

        }

     

        p->name = (char *)malloc(strlen("mike") + 1);

     

        // 只要指针指向的空间都在堆区

        p->age = 18;

        strcpy(p->name, "mike"); // 报错因为是指针

        p->score = 59;

     

        printf("%d,%s,%d ", p->age, p->name, p->score);

     

        // 先释放name

        if (p->name != NULL)

        {

            free(p->name);

            p->name = NULL;

        }

     

        // 再释放p

        if( p != NULL)

        {

            free(p);

            p = NULL;

        }

       

     

        // 再释放p

     

        return 0;

    }

     

     

    // 释放的时候一定先释放蓝色的 再释放p

    18 结构体和指针使用总结

    19 共用体

    结构体字节对齐(就业班)

    结构体位段(就业班)

    共用体(也叫联合体):(共用一块内存空间

    改了一个成员会影响到其他的成员,因为是共用体(共用一个内存

    20 枚举的使用

    #include <stdio.h>

    #include <string.h>

    #include <stdlib.h>

     

    // enum是关键字

    // 里面的成员是一个标识符,枚举常量

    // 第一个成员如果没有赋值,默认为0,下一个成员比上一个多1

    // 枚举类型 enum Color

    // 成员: 枚举成员,枚举常量

    enum Color

    {

        pink, //0

        red, //1

        green = 10,

        white, //11

        blue, //12

        yellow // 。。。

    };

     

    int main()

    {

        int flag = 1;

        if (flag == red)

        {

            printf("red ");

        }

     

        // 枚举变量flag2

        enum Color flag2;

     

        //1、可以使用枚举成员给flag赋值

        flag2 = pink; // 等价于pink = 0

     

        //2、也可以使用常量给flag赋值,不推荐

        flag2 = 3;

     

        return 0;

    }

    21.type def的使用(在数据结构使用较多

    #include <stdio.h>

    #include <string.h>

    #include <stdlib.h>

     

    struct Test

    {

        int a;

    };

    // 定义一个结构体变量

    struct Test obj;

     

    // struct Test2类型起一个别名叫Test2

    typedef struct Test2

    {

        int a;

    }Test2;

     

    Test2 tmp;

     

    int main()

    {

        // 1typedef给一个已存在的类型起一个别名

        // 2typedef不能创建新类型

     

        // int起一个别名叫int64

        typedef int int64; // 有分号

     

        int64 a; //int a; // 宏定义发生在预处理

                 // typedef是在编译阶段

     

        return 0;

    }

  • 相关阅读:
    SDUT 2143 图结构练习——最短路径 SPFA模板,方便以后用。。 Anti
    SDUT ACM 1002 Biorhythms 中国剩余定理 Anti
    nyist OJ 119 士兵杀敌(三) RMQ问题 Anti
    SDUT ACM 2157 Greatest Number Anti
    SDUT ACM 2622 最短路径 二维SPFA启蒙题。。 Anti
    二叉索引树 区间信息的维护与查询 Anti
    SDUT ACM 2600 子节点计数 Anti
    UVA 1428 Ping pong 二叉索引树标准用法 Anti
    2010圣诞Google首页效果
    Object
  • 原文地址:https://www.cnblogs.com/eret9616/p/10223067.html
Copyright © 2011-2022 走看看