• 七.结构体


    目录

    一.结构体的定义

    1.结构的基础知识

    2.结构的声明

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

    二.结构体成员的访问

    三.结构体的传参


    一.结构体的定义

    1.结构的基础知识

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

    2.结构的声明

    基本格式:

    struct tag          //结构体关键字

    {

         member - list; //成员变量
    }variable - list; //全局的结构体变量

     注意:

    • 成员变量之间用分号隔开,全局变量之间用逗号隔开;
    • 结构体末大括号后必须加上分号(即使不写全局变量也要加上);

    例,使用结构体描述一本书,需要:书名,书的价格,作者和国家。

    1. //struct - 结构体关键字
    2. //Book - 结构体标签
    3. //struct Book - 结构体类型
    4. struct Book {
    5. /* 成员变量 */
    6. char name[20]; // 定义一个结构体类型
    7. int price;
    8. char country[10];
    9. char author[20];
    10. } s1, s2, s3; // s1,s2,s3 是三个全局的结构体变量
    11. int main()
    12. {
    13. struct Book s; // 创建结构体变量
    14. return 0;
    15. }

     用typedef进行定义:

    1. typedef struct Book {
    2. char name[20];
    3. int price;
    4. char auther[10];
    5. char country[20];
    6. } Book;
    7. int main()
    8. {
    9. Book s1; // 前面加typedef之后可以作为一个单独的类型来使用
    10. struct Book s2;// 不影响
    11. return 0;
    12. }

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

    使用大括号进行初始化:

    1. typedef struct Book {
    2. /* 成员变量 */
    3. char name[20]; // 定义一个结构体类型
    4. int price;
    5. char country[10];
    6. char author[20];
    7. } Book;
    8. int main()
    9. {
    10. Book s0 = {}; // 使用大括号初始化
    11. Book s1 = {"CSDN", 20, "CHINA", "CSDN"};
    12. Book s2 = {"活着", 30, "中国", "余华"};
    13. return 0;
    14. }

    二.结构体成员的访问

    通过点操作符(.)进行访问,例:

    1. struct Book {
    2. /* 成员变量 */
    3. char name[20]; // 定义一个结构体类型
    4. int price;
    5. char country[10];
    6. char author[20];
    7. } s1, s2, s3; // s1,s2,s3 是三个全局的结构体变量
    8. int main()
    9. {
    10. struct Book s={"活着“,30,"中国","余华"};
    11. printf("%s %d",s.name,s.price); //.操作符进行访问
    12. }

     打印结果为:余华 30

    三.结构体的传参

    传参有两种形式:

    • 传结构体(使用结构体接收);
    • 传地址(使用结构体指针接收);

    1.结构体传参

    1. typedef struct Book {
    2. char name[20];
    3. int price;
    4. char country[10];
    5. char auther[20];
    6. } Book;
    7. void print_by_s(Book tmp) //结构体为临时变量
    8. {
    9. printf("书名: %s\n", tmp.name);
    10. printf("价格: %d\n", tmp.price);
    11. printf("国家: %s\n", tmp.country);
    12. printf("作者: %s\n", tmp.auther);
    13. }
    14. int main()
    15. {
    16. Book s1 = {"活着", 30, "中国", "余华"}; // 使用大括号初始化
    17. /* 打印结构体数据 */
    18. print_by_s ( s1 ) ; // 传结构体
    19. return 0;
    20. }

    2.结构体指针传参

    1. typedef struct Book {
    2. char name[20];
    3. int price;
    4. char country[10];
    5. char auther[20];
    6. } Book;
    7. void print_by_s(Book *tmp) //结构体指针
    8. {
    9. printf("书名: %s\n", tmp.name);
    10. printf("价格: %d\n", tmp.price);
    11. printf("国家: %s\n", tmp.country);
    12. printf("作者: %s\n", tmp.auther);
    13. }
    14. int main()
    15. {
    16. Book s1 = {"活着", 30, "中国", "余华"}; // 使用大括号初始化
    17. /* 打印结构体数据 */
    18. print_by_s ( &s1 ) ; // 传结构体的地址
    19. return 0;
    20. }

    相比第一种传结构体,传结构体的地址其实更好一些,这是因为:

    函数传参的时候,参数是需要压栈的。
    如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
    并且,传地址效率高,方便修改,也不用再拷贝数据,所以首选传结构体的地址。

    本篇到此结束 ,码文不易,还请多多支持哦~

  • 相关阅读:
    oracle性能优化:ORACLE SQL性能优化系列 (三)[转]
    习题 --- 双指针算法、离散化
    双飞翼布局
    PMP认证可以用来干什么呢?
    七日杀Liunx SteamCMD开服超详细教程及服务器配置需求
    apt-get upgrade 和 dist-upgrade 之间的区别
    Flink CDC介绍和个人理解
    python中logging日志模块
    hwk4:C++ 运算符重载
    【keras-yolo3】
  • 原文地址:https://blog.csdn.net/weixin_67401157/article/details/127993868