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;

    }

  • 相关阅读:
    PHP-xml-1
    BZOJ 1833 ZJOI2010 count 数字计数 数位DP
    运算符总结
    大写和小写转换
    Java基础:泛型
    Codeforces Round #156 (Div. 2)---A. Greg&#39;s Workout
    【Git】GitHub for Windows使用(2) 分支
    【Git】GitHub for Windows使用(1)
    【java JVM】JVM中类的加载,加载class文件的原理机制
    【FTP】org.apache.commons.net.ftp.FTPClient实现复杂的上传下载,操作目录,处理编码
  • 原文地址:https://www.cnblogs.com/eret9616/p/10223067.html
Copyright © 2011-2022 走看看