• C语言基础知识 -- 初识结构体


    进阶知识:自定义类型详解(结构体+枚举+联合)

    • 结构体类型的声明
    • 结构体初始化
    • 结构体成员访问
    • 结构体传参

    1.结构体的声明

    • 结构的基础知识:结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。
    • 结构的基础知识:结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。
    • 结构体成员的类型:可以是标量、数组、指针,甚至是其他结构体
    1. #include
    2. // 描述一个学生
    3. // struct --结构体关键字
    4. // stu --结构体标签
    5. // struct stu --结构体类型
    6. // 结构体声明是一条语句,所以分号必不可少
    7. // 结构体声明
    8. struct stu
    9. {
    10. char name[20];
    11. short age;
    12. char tele[12];
    13. char sex[5];
    14. } s1, s2, s3; // s1, s2, s3是三个全局的结构体变量
    15. // 尽量少用全局变量
    16. int main()
    17. {
    18. struct stu s; // s为局部变量
    19. return 0;
    20. }
    1. typedef struct stu
    2. {
    3. char name[20];
    4. short age;
    5. char tele[12];
    6. char sex[5];
    7. } STU; //给结构体重新起个名字叫STU,通过STU创建结构体变量
    8. int main()
    9. {
    10. // struct stu s; // s为局部变量
    11. STU s; // 功能与上相同
    12. return 0;
    13. }

    这两种定义结构体的方法,选用哪一种都可以

    1. #include
    2. typedef struct stu
    3. {
    4. char name[20];
    5. short age;
    6. char tele[12];
    7. char sex[5];
    8. } STU; //给结构体重新起个名字叫STU,通过STU创建结构体变量
    9. int main()
    10. {
    11. STU s1 = {"张三",20,"123456789","男"};
    12. struct stu s2 = {"张三",20,"123456789","男"};
    13. return 0;
    14. }

    结构体嵌套(重要)

    1. struct S
    2. {
    3. int a;
    4. char arr[20];
    5. double d;
    6. };
    7. struct T
    8. {
    9. char ch[10];
    10. struct S s;
    11. char *pc;
    12. };
    13. int main()
    14. {
    15. char arr[] = "bit";
    16. struct T t = {"123", {100, "hello", 3.14}, arr}; // 数组名为首元素的地址,传递给指针
    17. printf("%s\n", t.ch);
    18. printf("%s\n", t.s.arr);
    19. return 0;
    20. }

    2.结构体成员的访问

    • 结构体变量访问成员:通过点操作符(.)访问,点操作符接受两个操作数

    3. 结构体传参

    1. #include
    2. typedef struct stu
    3. {
    4. char name[20];
    5. short age;
    6. char tele[12];
    7. char sex[5];
    8. } STU;
    9. STU s = {"张三", 20, "312654", "男"};
    10. //结构体传参
    11. void Print1(STU temp)
    12. {
    13. printf("%s\n", temp.name);
    14. printf("%d\n", temp.age);
    15. }
    16. //结构体传址
    17. void Print2(STU *temp)
    18. {
    19. printf("%s\n", temp->name);
    20. printf("%d\n", temp->age);
    21. }
    22. int main()
    23. {
    24. Print1(s);
    25. Print2(&s);
    26. return 0;
    27. }

    函数传参时,首选Print2的方法,在传参时,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。

    总结:结构体传参的时候,要传结构体的地址。

    4 压栈

    1. 栈区:局部变量、函数的形式参数、函数调用也开辟空间
    2. 堆区:动态内存分配
    3. 静态区:全局变量、静态变量
    4. 栈:先进后出,后进先出
    5. 插入一个元素叫压栈,删除一个元素叫出栈

    5 程序调试技巧

    1. BUG:臭虫,历史上第一个BUG
    2. 调试(debug):一名优秀的程序员是一名出色的侦探,每一次调试都是尝试破案的过程

    调试的基本步骤

    1. 发现程序错误的存在
    2. 以隔离、消除等方式对错误进行定位
    3. 确定错误产生的原因
    4. 提出纠正错误的解决办法
    5. 对程序错误予以改正,重新测试
  • 相关阅读:
    找不到vcruntime140_1.dll,无法继续执行代码怎么办?5个可以解决的方案分享
    张瑞敏荣登世界管理思想家名人堂
    机器人过程自动化(RPA)入门 3. 顺序、流程图和控制流程
    集群时的缓存同步
    基于深度学习的图像识别技术研究
    集群扩容与半同步复制
    Vuex从了解到实际运用,彻底搞懂什么是Vuex(一)
    智慧校园管理系统
    将文件流转成file文件后使用luckysheet回显数据
    Web前端vueDemo—实现图片切换功能(二)
  • 原文地址:https://blog.csdn.net/qq_45355603/article/details/126161268