C语言基础十:结构体【重点】

1.引入
    现实世界中的物体要 抽象成 计算机语言中的类型才能被计算机识别
    属性---->数据类型
    学生:
        学号       int
        性别       char 
        姓名       char name[20]
    自定义类型:结构体、共用体、枚举
2.结构体
    2.1定义格式
        struct 结构体名
        {
            成员列表 ; // 数据类型  成员变量名
        };
        “结构体名”:C语言合法的标识符即可
         数据类型 :C语言合法的数据类型
         成员变量名:C语言合法的标识符即可
        例子:
            struct student
            {
                int No;
                char sex;
                char name[20];
            };
            struct student stu1;
            struct student表示的是数据类型,stu1表示变量名 
            struct student *stu1;stu1表示指针变量名,struct student表示指针变量要指向的数据类型。
    2.2内存中的存放    
        1.结构体类型所占的内存是各成员变量的内存之和
        
        ps:1.结构体分配的空间按变量的定义顺序各自分配空间
            2.内存对齐,与最长的对齐或者4的整数倍取一个最小
    2.3结构体变量的引用
            struct student stu1;
                1.结构体类型名.成员变量名
                    stu.No=100;
                    int b=stu.No;
                struct student *p;
                2.结构体变量名->成员变量名
                    1)p=&stu1;
                    2)p=(struct student *)malloc(sizeof(stu1));
                       p->No=10;
        
                例:#include<stdio.h>
                    #include<string.h>
                    #include<stdlib.h>
                    struct student
                    {
                        int No;
                        char sex;
                        char name[20];
                    };
                    int main()
                    {
                        struct student stu;
                        stu.No=100;
                        //stu.name="123";
                        strcpy(stu.name,"234");
                        printf("%s\n",stu.name);

                        struct student *p;
                        p=(struct student*)malloc(sizeof(struct student));
                        
                        p->No=10;
                        
                        return 0;
                    }
        
        2.4结构体的初始化
                1.对前面顺序的n个进行初始化
                    struct student stu1={11401,'M',"zhangsan"};
                2.对任意进行初始化
                    struct student stu1={
                                        .No=123,
                                        
                                        .name="zhangsan",
                                        .sex='M',
                                        
                        };
                        
                3.结构体数组初始化化
                    struct student stu[5]={ {.name="zhangsan"},{},{},{},{}  };
                    
                    
        2.5 struct 
            {
                int a;
                int b;
            }A,B,C;
            A,B,C为变量名,类型为 struct {int a,int b};
            typeof(A) D;
3.联合体
    union 共用体名
    {
        成员列表;// 成员数据类型  变量名
    };
    例:union a
        {
            char c;
            int a;    
        };
        联合体分配的空间是最大数据类型长度的空间。
        #include<stdio.h>
        union a
        {
            
            int a;
            char c;
        };
        int main()
        {
            union a da;//union a:表示数据类型  da 变量名
            printf("%d",sizeof(da));//结果为4   最大类型长度
            return 0;
        }
        大端模式:低地址存高字节的内容,高地址存低字节的内容
        小端模式:低地址存低字节的内容,高地址存高字节的内容
4.枚举
        把一个变量所有可能的值列举出来
    
    定义:enum 枚举名{可能的值};
            
            ps:1.枚举的值默认为一个整型常量,默认处理为0,1,2,3....
               2.枚举常量mon=4是错误的的,不可对它进行改变
               3.enum day{one=8 ,two,three};那么one后面对应的整型常量就应该为9  10 ...
                #include<stdio.h>
                enum weekday{mon,tue,wed};
                enum day{one=10 ,two,three};
                int main()
                {

                    enum weekday wd;//enum weekday :数据类型  wd是变量名

                    wd=mon;//mon tue wed默认为枚举常量,不可改变
                    wd=4;
                    //mon =5;
                    printf("%d\n",wd);    
                    enum day dy;
                    dy=two;
                    printf("dy=%d\n",dy);
                    return 0;
                }
        ex1.写一个代码,判断是大端模式还是小端模式?
        
        ex2.从屏幕上输入5个学生成绩、学号、姓名,按成绩大小输出学生的成绩、姓名、学号
                struct student
                {
                    int grade;
                    int NO;
                    char name[20];//char *name
                };
            1.用scanf输入 struct student stu[5];
            2.排序
            3.输出
            
            
            
            
    

            
            
            
            
            
            
 

猜你喜欢

转载自blog.csdn.net/qq_26128879/article/details/82820587