• C语言学习笔记之 复合类型


    复合类型

    结构体

    结构体中的成员空间是独立的,没有空间,只有大小

    定义

    // stu结构体,相当于一个模具
    struct stu
    {
        int num; // 不要赋值
        char name[16];
        int age;
    }; // 一定要有分号
    

    结构体变量的定义

    // 方法一:定义结构体同时定义变量
    struct stu
    {
        int num;
        char name[16];
        int age;
    }lucy; // lucy为结构体变量
    
    // 方法二:定义结构体后定义变量
    struct stu
    {
        int num;
        char name[16];
        int age;
    };
    
    struct stu lucy; // 结构体变量
    

    初始化与赋值

    #include <stdio.h>
    
    struct stu
    {
        int num;
        char name[16];
        int age;
    }lucy = {1,"Lucy",13}; // 初始化
    
    int main()
    {
        // 数据必须和成员顺序一样
        struct stu bob = {2,"BOb",14}; // 初始化
        bob.age = 15; // 赋值
        printf("lucy.name = %s
    bob.age = %d
    ",lucy.name,bob.age);
    
        return 0;
    }
    
    lucy.name = Lucy
    bob.age = 15
    

    两个相同结构体变量可以直接用来赋值

    struct stu
    {
        int num;
        char name[16];
        int age;
    };
    
    struct stu bob,lucy;
    lucy = {1,"Lucy",14};
    bob = lucy; // 直接用同类型结构体赋值
    

    结构体数组

    #include <stdio.h>
    #include <string.h>
    
    struct stu
    {
        int num;
        char name[16];
        int age;
    };
    
    int main()
    {
        struct stu arr[5];
        memset(arr,0,sizeof(arr));
    
        printf("请输入5个学生信息:
    ");
        for (size_t i = 0; i < 5; ++i)
        {
            scanf("%d %s %d",&arr[i].num,&arr[i].name,&arr[i].age);
        }
        int sum;
        for (size_t i = 0; i < 5; ++i)
        {
            sum += arr[i].age;
        }
    
        printf("平均年龄:%.2f
    ",(double)sum / 5.0);
    
        return 0;
    }
    
    请输入5个学生信息:
    1 Bob 13
    2 Lucy 14
    3 Jack 12
    4 小李 11
    5 小王 14
    平均年龄:17.40
    

    结构体嵌套结构体

    结构体指针

    #include <stdio.h>
    #include <string.h>
    
    struct stu
    {
        int num;
        char name[16];
        int age;
    };
    
    int main()
    {
        struct stu lucy;
        struct stu *p = NULL;
    
        memset(&lucy,0,sizeof(lucy));
        p = &lucy;
    
        printf("请输入数据:");
        scanf("%d %s %d",&p -> num, &p -> name, &p -> age); 
    
        printf("lucy.age = %d
    
    p -> age = %d
    
    lucy.name = %s
    
    p -> name = %s
    
    lucy.num = %d
    
    p -> num = %d
    ",
    lucy.age,
    p -> age,
    lucy.name,
    p -> name,
    lucy.num,
    p -> num);
    
        return 0;
    }
    
    请输入数据:1 Lucy 14
    lucy.age = 14
    p -> age = 14
    lucy.name = Lucy
    p -> name = Lucy
    lucy.num = 1
    p -> num = 1
    

    结构体空间在堆区

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    struct stu
    {
        int num;
        char name[16];
        int age;
    };
    
    int main()
    {
        struct stu *p = NULL;
        p = (struct stu *)malloc(sizeof(struct stu));
        memset(p,0,sizeof(struct stu));
    
        scanf("%d %s %d",&p -> num, &p -> name, &p -> age);
    
        printf("num = %d
    name = %s
    age = %d
    ",p -> num,p -> name,p -> age);
    
        if (p != NULL)
        {
            free(p);
            p = NULL;
        }
    
        return 0;
    }
    
    1 Jack 14
    num = 1
    name = Jack
    age = 14
    

    堆区的结构体数组

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    struct stu
    {
        int num;
        char name[16];
        int age;
    };
    
    int main()
    {
        int n;
        printf("请输入学生个数:");
        scanf("%d",&n);
    
        struct stu *arr = NULL;
        arr = (struct stu *)malloc(n * (sizeof(struct stu)));
    
        for (size_t i = 0; i < n; ++i)
        {
            printf("请输入第%d个学生数据:",i + 1);
            scanf("%d %s %d",&arr[i].num, &arr[i].name, &arr[i].age);
        }
        
        for (size_t i2 = 0; i2 < n; ++i2)
        {
            printf("num = %d, name = %s, age = %d
    ",(arr + i2) -> num, (arr + i2) -> name, (arr + i2) -> age);
        }
    
        if (arr != NULL)
        {
            free(arr);
            arr = NULL;
        }
    
        return 0;
    }
    
    请输入学生个数:3
    请输入第1个学生数据:1 Lucy 13
    请输入第2个学生数据:2 Jack 14
    请输入第3个学生数据:3 Bob 15
    num = 1, name = Lucy, age = 13
    num = 2, name = Jack, age = 14
    num = 3, name = Bob, age = 15
    

    结构体成员为指针

    // 例1:C语言实现“类”
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    struct people
    {
        int money;
        void (*makemoney)(struct people *people1);
    };
    
    static void __makemoney(struct people *people1)
    {
        people1 -> money += 1000;
    }
    
    int main()
    {
        struct people people1 = {100,__makemoney};
        printf("money:%d
    ",people1.money);
        people1.makemoney(&people1);
        printf("money:%d
    ",people1.money);
    
        return 0;
    }
    
    money:100
    money:1100
    

    结构体在堆区,成员也指向堆区

    内存对齐

    原文链接:https://mp.weixin.qq.com/s/H1rgISh5usodzHs8qnxgAw

    文章来源于编程珠玑 ,作者守望先生

    共用体

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    union data
    {
        int a;
        int b;
        int c;
    };
    
    
    int main()
    {
        printf("大小:%d
    ",sizeof(union data));
        union data data1;
        data1.a = 1;
        data1.b = 3;
        data1.c = 10;
    
        printf("a = %d
    sum = %d
    ",data1.a,data1.a + data1.b + data1.c);
    
        return 0;
    }
    
    大小:4
    a = 10
    sum = 30
    

    共用体虽然共用一段空间,但成员能使用空间的大小由成员自身类型决定

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    union data
    {
        int a;
        short b;
        char c;
    };
    
    int main()
    {
        printf("大小:%d
    ",sizeof(union data));
        union data data1;
        data1.a = 0x01020304;
    
        printf("a = %#x
    b = %#x
    c = %#x
    ",data1.a,data1.b,data1.c);
    
        return 0;
    }
    
    大小:4
    a = 0x1020304
    b = 0x304
    c = 0x4
    

    枚举

    将要赋的值一一列出来

    定义:

    enum 名称 {枚举列表};
    

    例:

    #include <stdio.h>
    
    enum BOOL {True = 1,False = 0};
    
    int main()
    {
        enum BOOL flag = True;
        if (flag)
        {
            printf("True
    ");
        }
    
        return 0;
    }
    
    True
    

    typedef

    已有的类型取一个别名

    #include <stdio.h>
    
    typedef int Int32; // 给int取别名
    typedef enum BOOL {True = 1,False = 0}Bool; // 给枚举取别名
    
    typedef struct
    {
        Int32 num; // 相当于int num;
    }stu;
    
    stu student;
    
    int main()
    {
        Bool flag = True;
        if (flag)
        {
            printf("True
    ");
        }
    
        return 0;
    }
    
  • 相关阅读:
    MySQL5.7的Linux安装shell脚本之二进制安装
    MySQL与Mongo简单的查询 1
    order by 与group by 之间排序问题
    说说左连接出现重复记录的问题
    MySQL5.6的Linux安装shell脚本之二进制安装(一)
    搭建简单FTP服务器以及过程中容易遇到的几个问题(一)
    jqurty
    jquery中的事件与动画
    SQL SERVER数据库设计与现实
    jquery2
  • 原文地址:https://www.cnblogs.com/zhujiangyu/p/13755944.html
Copyright © 2020-2023  润新知