C语言-04

发布时间 2023-07-12 23:20:34作者: -seventy-

自定义数据类型——初识

/*
    引入:
        学生:姓名,学号,年龄,成绩
        请为学生们专门定制一个类型(创造一个类型)


    结构体格式:
        struct 标识符    // 标识符即自定义类型的名称
        {
            成员;    // 自己设置
        };    // 这里要注意不要漏了分号


    struct Students        // 定义一个学生类型
    {
        char name[12];
        int id;
        int age;
        int score;
    };


    我们知道:

        类型    变量名;
        int          x;
           x = 10;        // 赋值操作
        ---初始化操作 int y = 10;



    那么同理:

        结构化类型        结构体变量名;
      struct Students        stu_1;
        stu_1 = {"张三", 52, 18, 616};    // 为4个成员初始化

        其他内容补充:
            1.访问结构体变量的成员
                stu_1.name;
                stu_1.id;
                stu_1.age;
                stu_1.score;

            2.成员赋值
                stu_1.name = "张三";    // 操作错误!!
                正确操作为:
                    1.引入头文件<string.h>
                    2.strcpy(stu_1.name, "张三")    // 作用:将后面字符串"复制到"前面


                stu_1.id = 52;    // 操作正确
                stu_1.age = 18;    // 操作正确
                stu_1.score = 616;    // 操作正确

*/


# include <stdio.h>
# include <string.h>

// 定义一个学生类型,类似于创造int、long...这些类型,只不过学生类型是自定义罢了
struct Students
{
    char name[12];
    int id;
    int age;
    int score;
};

int main()
{
    struct Students    stu_1;
    stu_1.age = 18;
    strcpy(stu_1.name, "张三");
    printf("%s, %d\n", stu_1.name, stu_1.age);

    struct Students    stu_2 = { "李四", 39, 17, 553 };
    printf("%s, %d\n", stu_2.name, stu_2.age);
}

自定义类型——给类型取别名

# include <stdio.h>

struct Human    // 定义一个 (struct)Human 类型
{
    char name[12];
    int age;
};

int main()
{
    typedef int Myint;    // 将int类型“取别名”为 Myint
    int x = 1;
    Myint y = 1;
    printf("%d\n", x + y);

    typedef struct Human hm;    // 将 struct Human 类型取别名hm
    hm obj_1 = { "tomato", 18 };
    printf("%s %d \n", obj_1.name, obj_1.age);

    return 0;
}
/*
    补充:
        在定义一个自定义类型的时候
        往往直接当场取别名,而不是以后才取
    e.g.
        struct Human    // 定义一个 (struct)Human 类型
        {
            char name[12];
            int age;
        }typedef hm;    // 直接当场取别名为hm
*/

自定义类型——结构体数组

# include <stdio.h>

// 定义一个类型
struct Hero
{
    char name[12];
    int level;
}typedef hr;    // 取别名

int main()
{ 
    // 初始化
    hr hero_1 = { "钢铁侠", 8 };
    hr hero_2 = { "蜘蛛侠", 7 };

    // 初始化
    hr hero_arr[9] = {    
        { "惊奇队长", 10 },
        { "美国队长", 7 },
        { "雷神", 8 },
        { "绿巨人", 9 },
        // 剩下的使用默认
    };

    // 修改
    hero_arr[0] = hero_1;

    return 0;
}

自定义类型——联合类型

/*
    union语法形式如下所示:

        union 名字    // union 关键字是用来定义"联合类型"
        {
            成员;    // 见详情
        }


        详情:
            修改一个成员的值,所有成员的值都会相应的产生变化
            原因:所有成员,内存是相同的(---如何理解?)
        ---如何理解?
            如下面代码中,num、d、ch 并不是各自独立占据一块内存,
            而是先看谁最大,因为 double 占8个字节,比 int 占的4个字节
            和 char 占的1个字节都要大,即 double > int > char
            所以,所有的成员,即整体一共被分配了8个字节
            因此,不同成员之间会出现联合占据某块内存空间的情况
            而在本例中,double 占了8/8,int 占了4/8,char 占了1/8
*/

# include <stdio.h>

union HUMAN
{
    int num;
    double d;
    char ch;
}typedef hm;    // 取别名

int main()
{ 
    hm u_1;
    u_1.num = 66;
    u_1.d = 10.0;
    u_1.ch = 'A';

    return 0;
}

自定义类型——枚举