• 【C语言航路】第七站:结构体初阶


    目录

    一、结构体的声明

    1.结构的基础知识

    2.结构的声明

    3.结构体成员的类型

    4.结构体变量的定义和初始化

    二、结构体成员的访问

     三、结构体传参

    总结


    一、结构体的声明

    1.结构的基础知识

    结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量

    2.结构的声明

    struct tag

    {

            member-list;

    }variable-list;

    其中,tag是结构体标签,是可以根据需求进行更改的

    struct tag是结构体类型

    member-list是结构体成员(成员列表)

    variable-list是结构体变量

    如下所示就是一个结构体的声明,但是还没有创建变量。

    1. struct Stu
    2. {
    3. //结构体成员
    4. char name[20];
    5. int age;
    6. char sex[10];
    7. float sorce;
    8. };

    下面代码就是结构体的创建变量的过程了

    1. #include<stdio.h>
    2. struct Stu
    3. {
    4. //结构体成员
    5. char name[20];
    6. int age;
    7. char sex[10];
    8. float sorce;
    9. }s4,s5;//s4,s5也是结构体变量
    10. int main()
    11. {
    12. //创建结构体变量
    13. struct Stu s1, s2, s3;
    14. return 0;
    15. }

    当然这两种定义结构体的变量是有一点区别的,s1,s2,s3都是局部的结构体变量,而s4,s5都是全局的。

    当然我们也可以将s1,s2,s3,这些按照他们的那种方式定义在主函数外面,这样他们也就是全局变量了

    结构体也可以在主函数内部进行声明,不过一般都不会这样使用的

    1. #include
    2. int main()
    3. {
    4. struct Stu
    5. {
    6. //结构体成员
    7. char name[20];
    8. int age;
    9. char sex[10];
    10. float sorce;
    11. };
    12. //创建结构体变量
    13. struct Stu s1, s2, s3;
    14. return 0;
    15. }

    3.结构体成员的类型

    结构体成员的类型可以是标量,数组,指针,甚至是其他结构体

    4.结构体变量的定义和初始化

    我们看如下代码:

    1. #include<stdio.h>
    2. struct Stu
    3. {
    4. //结构体成员
    5. char name[20];
    6. int age;
    7. char sex[10];
    8. float sorce;
    9. };
    10. int main()
    11. {
    12. struct Stu s1 = { "zhangsan",18,"nan",91.5f };
    13. struct Stu s2 = { "wangwu",19,"秘密",60.5f };
    14. printf("%s %d %s %.1f\n", s1.name, s1.age, s1.sex, s1.sorce);
    15. printf("%s %d %s %.1f\n", s2.name, s2.age, s2.sex, s2.sorce);
    16. return 0;
    17. }

    这段代码就定义了一个结构体变量,然后并对其进行赋值初始化,然后打印出这些信息。运行结果如下

     当然,我们在前文中提到过,结构体里面的成员可以是结构体。我们来看下面的代码

    1. #include
    2. struct S
    3. {
    4. int a;
    5. int b;
    6. };
    7. struct P
    8. {
    9. double c;
    10. struct S s;
    11. float d;
    12. };
    13. int main()
    14. {
    15. struct P p = { 3.14,{5,6},4.58f };
    16. printf("%lf,%d,%d,%f", p.c, p.s.a, p.s.b, p.d);
    17. return 0;
    18. }

    这段代码就是在结构体中嵌套了一个结构体,我们进行初始化的时候,就要对里面在嵌套一层括号了,然后打印的时候,先使用.操作符找到里面的那个结构体,然后在使用.操作符,就能找到结构体里面的结构体的成员了.

    二、结构体成员的访问

    其实在上面我们已经提及了一种结构体成员的访问方式,就是使用.操作符

    如下所示,我们可以通过一个函数,将p这个结构体变量给传过去,然后通过函数来打印。但是需要注意的是,这里是传值调用。

    1. #include
    2. struct S
    3. {
    4. int a;
    5. char b;
    6. };
    7. struct P
    8. {
    9. double c;
    10. struct S s;
    11. float d;
    12. };
    13. void Print1(struct P ps)
    14. {
    15. printf("%lf,%d,%c,%f\n", ps.c, ps.s.a, ps.s.b, ps.d);
    16. }
    17. int main()
    18. {
    19. struct P p = { 3.14,{5,'b'},4.58f};
    20. //printf("%lf,%d,%c,%f", p.c, p.s.a, p.s.b, p.d);
    21. Print1(p);
    22. return 0;
    23. }

    当然,也可以传入地址过去

    1. #include<stdio.h>
    2. struct S
    3. {
    4. int a;
    5. char b;
    6. };
    7. struct P
    8. {
    9. double c;
    10. struct S s;
    11. float d;
    12. };
    13. void Print1(struct P ps)
    14. {
    15. printf("%lf,%d,%c,%f\n", ps.c, ps.s.a, ps.s.b, ps.d);
    16. }
    17. void Print2(struct P* ps)
    18. {
    19. //结构体变量.成员名
    20. printf("%lf,%d,%c,%f\n", (*ps).c, (*ps).s.a, (*ps).s.b, (*ps).d);
    21. //结构体指针->成员名
    22. printf("%lf,%d,%c,%f\n", ps->c,ps->s.a, ps->s.b, ps->d);
    23. }
    24. int main()
    25. {
    26. struct P p = { 3.14,{5,'b'},4.58f};
    27. //printf("%lf,%d,%c,%f", p.c, p.s.a, p.s.b, p.d);
    28. Print1(p);
    29. Print2(&p);
    30. return 0;
    31. }

    这样的话,我们打印就有两种方式了,一种是先解引用然后使用.操作符,另外一种就是使用结构体->结构体成员

    运行结果为

     三、结构体传参

    关于结构体的传参其实已经在上面有所涉及,这里我们来提出一个问题,上面的代码中,print1好还是print2好呢?

    其实答案是print2,因为函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。


    总结

    本小节讲述了结构体的声明和定义,结构体的访问以及结构体传参这些知识,当然这些知识还是不够的,因此我们这节课才叫做结构体初阶。后续我们结构体还会更加详细的展开讲解

  • 相关阅读:
    Centos7系统重装报错“ /dev/root does not exist“解决办法
    Linux运维实战:CentOS7.6操作系统从入门到精通(11-15)
    Hbase简介
    微服务-Eureka
    第25集丨人生中最高的精神价值
    技术分享 | Jenkins中,如何管理用户及其相对应权限?
    C++ 产生随机数函数
    杰哥教你面试之一百问系列:java中高级多线程concurrent的使用
    JSON转换List<Map<String, Object>>、Map<String, Object>
    拼多多商品详情API接口接入流程如下:
  • 原文地址:https://blog.csdn.net/jhdhdhehej/article/details/128115707