11.郝斌C语言笔记——结构体

为什么需要结构体

    为了表示一些复杂的事物,而普通的基本类型无法满足实际要求.

为什么叫结构体

    把一些基本数据组合在一起形成的一个新的复合数据类型,这个叫做结构体.

如何定义结构体

    3种方式,推荐使用第一种:
    //第一种方式
    //这只定义了一个新的数据类型,并没有定义变量.
    struct Student
    {
        int age;
        float score;
        char sex;
    };

    //第二种方式
    struct Student2
    {
        int age;
        float score;
        char sex;
    }st2;

    //第三种方式
    struct Student
    {
        int age;
        float score;
        char sex;
    }st3;

怎样使用结构体变量

    > 赋值和初始化
        - 定义的同时可以整体赋初值;
        例如:
            struct Student st = {80, 66.6, 'F'};
        - 如果定义完之后,则只能单个的赋初值.
        例如:
            struct st2;
            st2.age = 10;
            st2.score = 88;
            st2.sex = 'F';
    
    > 如何取出结构体变量中的每一个成员
        - 结构体变量名.成员名
        - 指针变量名->成员名  (第二种方式更常用)
            指针变量名->成员名 在计算机内部会转化成  (*指针变量名).成员名
            的方式来执行
            所以说这两个方式是等价的        
        例子:
            struct Student
            {
                int age;
                float score;
                char sex;
            };

            int main(void)
            {
                struct Student st = {80, 66.6F, 'F'};//初始化 定义的同时赋初值.
                //66.6在C语言中默认是double类型,如果希望一个实数是float类型,
                //则必须在末尾加f或F,因此66.6是double,66.6f或66.6F是float类型.
                struct Student * pst = &st;//&st不能改成st.

                pst->age = 88;//第二种方式
                st.age = 10;

                return 0;
            }
        
        注意:
            pst->age在计算机内部会被转化成 (*pst).age, 没有什么为什么,
            这就是->的含义,这也是一种硬性规定;
            
            所以pst->age等价于 (*pst).age 也等价于 st.age.
            
            我们之所以知道 pst->age 等价于 st.age,是因为pst->age是被转化
            成了 (*pst).age 来执行.

            pst->age的含义:
            pst所指向的那个结构体变量中的age这个成员.           

    > 结构体变量和结构体指针变量作为函数参数传递的问题
        - 推荐使用结构体指针变量作为函数参数来传递.
        注意:
            函数参数只读不写的话可以用const关键字.

    > 结构体变量的运算
        - 结构体变量不能相加,不能相减,也不能相互乘除,
        但结构体变量可以相互赋值.
        例子:
            struct Student
            {
                int age;
                char sex;
                char name[100];
            };//分号不能省
            struct Student st1, st2;
            //st1+st2 st1*st2 st1/st2 都是错误的
            st1 = st2 或者 st2 = st1 都是正确的

举例:

/*
    动态构造存放学生信息的结构体数组
        动态构造一个数组,存放学生的信息
        然后按分数排序输出
*/

        #include <stdio.h>
        #include <malloc.h>

        struct Student
        {
            int age;
            float score;
            char name[100];
        };

        int main(void)
        {
            int len;
            struct Student * pArr;
            struct Student t;
            int i, j;

            //动态的构造一维数组
            printf("请输入学生的个数:\n");
            printf("len = ");
            scanf("%d", &len);
            pArr = (struct Student *)malloc(len * sizeof(struct Student));

            for (i = 0; i < len; ++i)
            {
                printf("请输入第%d个学生的信息:\n", i+1);
                printf("age = ");
                scanf("%d", &pArr[i].age);

                printf("name = ");
                scanf("%s", pArr[i].name);
                //name是数组名,本身就已经是数组首元素的地址,
                //所以pArr[i].name 不能改成 &pArr[i].name
                
                printf("score = ");
                scanf("%f", &pArr[i].score);
            }

            //按学生成绩升序排序 冒泡算法
            for (i = 0; i < (len - 1); ++i)
            {
                for (j = 0; j < (len - 1 - i); ++j)
                {
                    if (pArr[j].score < pArr[j+1].score)
                    {
                        t = pArr[j];
                        pArr[j] = pArr[j+1];
                        pArr[j+1] = t;
                    }
                }
            }

            printf("\n\n学生的信息是:\n");
            //输出
            for (i = 0; i < len; ++i)
            {
                printf("第%d个学生的信息:\n", i+1);
                printf("age = %d\n", pArr[i].age);
                printf("name = %s\n", pArr[i].name);
                printf("score = %f\n", pArr[i].score);
                printf("\n");
            }

            return 0;
        }
        /*
            在Microsoft Visual Studio 2010的过程:
            -----------------------------------
                请输入学生的个数:
                len = 3
                请输入第1个学生的信息:
                age = 2
                name = asd
                score = 2
                请输入第2个学生的信息:
                age = 5
                name = qwe
                score = 5
                请输入第3个学生的信息:
                age = 9
                name = zxc
                score = 9


                学生的信息是:
                第1个学生的信息:
                age = 9
                name = zxc
                score = 9.000000

                第2个学生的信息:
                age = 5
                name = qwe
                score = 5.000000

                第3个学生的信息:
                age = 2
                name = asd
                score = 2.000000

                请按任意键继续. . .
            -----------------------------------

            总结:
                ... ...
        */       

如有不对或者疏漏的地方,请多多指出。谢谢(⁄ ⁄•⁄ω⁄•⁄ ⁄)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值