• C语言 —— 结构体


    生活中有许多复杂对象是无法用基本数据类型来描述的, 于是为了描述复杂对象, C语言就会使用到结构体.

    1. 结构体的声明与定义

    1.1 结构的基础知识

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

    1.2 结构的声明与定义

    1. struct tag
    2. {
    3. member-list;
    4. }variable-list;

    例如描述一个人:

    1. //声明的结构体类型struct Peo
    2. struct Peo
    3. {
    4. char name[20];//名字
    5. char tele[12];//年龄
    6. char sex[5];//女 男 保密
    7. int high;//身高
    8. }p1, p2;//p1和p2是利用Peo结构类型创建的两个全局的结构体变量(可有可无)
    9. //注: p1, p2一般不写, 一般是在main中直接创建.
    struct Peo p1 = { 0 };//结构体变量的定义(创建)

    1.3 结构成员的类型

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

    1. struct Peo
    2. {
    3. char name[20];
    4. char tele[12];
    5. char sex[5];
    6. int high;
    7. };
    8. struct St
    9. {
    10. struct Peo p;
    11. int num;
    12. float f;
    13. };

    1.4 结构体变量的初始化

    1. struct Point
    2. {
    3. int x;
    4. int y;
    5. }p1; //声明类型的同时定义变量p1
    6. struct Point p2; //定义结构体变量p2
    7. //初始化:定义变量的同时赋初值。
    8. struct Point p3 = {x, y};
    9. struct Stu //类型声明
    10. {
    11. char name[15];//名字
    12. int age; //年龄
    13. };
    14. struct Stu s = {"zhangsan", 20};//初始化
    15. struct Node
    16. {
    17. int data;
    18. struct Point p;
    19. struct Node* next;
    20. }n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
    21. struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化

    2. 结构体成员的访问

    • 结构体变量访问成员

    结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。

    例如:

    我们可以看到s 有成员name 和age ;

    那我们如何访问s的成员?

    1. struct S s;
    2. strcpy(s.name, "zhangsan");//使用.访问name成员
    3. s.age = 20;//使用.访问age成员
    • 结构体指针访问指向变量的成员

    有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。

    那该如何访问成员?

    如下:

    1. struct Stu
    2. {
    3. char name[20];
    4. int age;
    5. };
    6. void print(struct Stu* ps)
    7. {
    8. printf("name = %s age = %d\n", (*ps).name, (*ps).age);
    9. //使用结构体指针访问指向对象的成员
    10. printf("name = %s age = %d\n", ps->name, ps->age);
    11. }
    12. int main()
    13. {
    14. struct Stu s = {"zhangsan", 20};
    15. print(&s);//结构体地址传参
    16. return 0;
    17. }

    3. 结构体传参

    1. struct S
    2. {
    3. int data[1000];
    4. int num;
    5. };
    6. struct S s = {{1,2,3,4}, 1000};
    7. //结构体传参
    8. void print1(struct S s)
    9. {
    10. printf("%d\n", s.num);
    11. }
    12. //结构体地址传参
    13. void print2(struct S* ps)
    14. {
    15. printf("%d\n", ps->num);
    16. }
    17. int main()
    18. {
    19. print1(s); //传结构体
    20. print2(&s); //传地址
    21. return 0;
    22. }

    上面的print1print2 函数哪个好些?

    答案是:首选print2函数。

    原因:

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

    结论:

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

  • 相关阅读:
    在 React项目中应用TypeScript
    web前端期末大作业 HTML+CSS+JavaScript仿安踏
    处理普通用户安装启动mysql报Can‘t find error-message file‘usrsharemysqlerrmsg.sys‘ 问题
    【JavaEE】TCP/IP协议
    HTTP状态码504(Gateway Timeout)报错原因分析和解决办法
    asp.net C#免费反编译工具ILSpy
    开创性的区块链操作系统项目——益智RPG游戏
    【电压质量】提高隔离电源系统的电压质量(Simulink实现)
    【Ubuntu】虚拟机安装系统与初始化配置
    自动驾驶---OpenSpace之Hybrid A*规划算法
  • 原文地址:https://blog.csdn.net/YeZh1Yong_Cr/article/details/133849838