C语言:结构体

embedded/2025/2/6 10:05:01/

一,结构体

  • C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。
  • 描述⼀个学⽣需要名字、年龄、学号、⾝⾼、体重等;
  • 描述⼀本书需要作者、出版社、定价等。C语⾔为了解决这个问题,增加了结构体这种⾃定义的数据类型,让程序员可以⾃⼰创造适合的类型。
    :结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如: 标量、数组、指针,甚⾄是其他结构体。

    1. 结构体的定义

    结构体的定义使用 struct 关键字,其基本语法如下:

    struct 结构体名 {数据类型 成员1;数据类型 成员2;// 可以有更多成员
    }variable-list;

    例如,定义一个表示学生信息的结构体:

    struct Student {char name[50];int age;float score;
    }variable-list;

    述代码定义了一个名为 Student 的结构体,它包含三个成员:一个字符数组 name 用于存储学生姓名,一个整型变量 age 用于存储学生年龄,一个浮点型变量 score 用于存储学生成绩。

    2. 结构体变量的声明

    定义好结构体后,可以声明该结构体类型的变量。有以下几种声明方式:

    方式一:先定义结构体,再声明变量
    struct Student 
    {char name[50];int age;float score;
    };int main() 
    {struct Student stu1; // 声明一个 Student 类型的变量 stu1return 0;
    }
    方式二:在定义结构体的同时声明变量
    struct Student{char name[50];int age;float score;
    } stu2; // 声明一个 Student 类型的变量 stu2int main(){// 使用 stu2return 0;
    }
    方式三:使用匿名结构体声明变量(匿名结构体声明变量只能声明一个
    struct 
    {char name[50];int age;float score;
    } stu3; // 声明一个匿名结构体类型的变量 stu3int main() 
    {// 使用 stu3return 0;
    }

    3. 结构体变量的初始化

     

    结构体变量可以在声明时进行初始化,有以下几种初始化方式:

    方式一:按成员顺序初始化
    #include <stdio.h>struct Student 
    {char name[50];int age;float score;
    };int main() 
    {struct Student stu = {"Alice", 20, 85.5};printf("姓名: %s, 年龄: %d, 成绩: %.2f\n", stu.name, stu.age, stu.score);return 0;
    }
    方式二:指定成员初始化
    #include <stdio.h>struct Student 
    {char name[50];int age;float score;
    };int main() 
    {struct Student stu = {.name = "Bob", .score = 90.0, .age = 21};printf("姓名: %s, 年龄: %d, 成绩: %.2f\n", stu.name, stu.age, stu.score);return 0;
    }

    4. 结构体成员的访问

    可以使用点运算符(.)来访问结构体变量的成员。例如:

    #include <stdio.h>
    #include <string.h>struct Student{char name[50];int age;float score;
    };int main(){struct Student stu;strcpy(stu.name, "Charlie");stu.age = 19;stu.score = 78.5;//    结构体变量.结构体成员名printf("姓名: %s, 年龄: %d, 成绩: %.2f\n", stu.name, stu.age, stu.score);return 0;
    }

    5.结构体数组

    结构体数组是由多个相同结构体类型的元素组成的数组。例如:

    #include <stdio.h>struct Student 
    {char name[50];int age;float score;
    };int main() {struct Student students[3] = {{"David", 22, 88.0},{"Eve", 20, 92.5},{"Frank", 21, 76.0}};for (int i = 0; i < 3; i++) 
    {printf("姓名: %s, 年龄: %d, 成绩: %.2f\n", students[i].name, students[i].age, students[i].score);}return 0;
    }

    6. 结构体指针

    可以定义指向结构体的指针,通过指针访问结构体成员时需要使用箭头运算符(->)。例如:

    #include <stdio.h>
    #include <string.h>struct Student 
    {char name[50];int age;float score;
    };int main() 
    {struct Student stu = {"Grace", 23, 89.5};struct Student *p = &stu;printf("姓名: %s, 年龄: %d, 成绩: %.2f\n", p->name, p->age, p->score);return 0;
    }

    7. 结构体作为函数参数

    结构体可以作为函数的参数进行传递,有值传递和地址传递两种方式。

    值传递
    #include <stdio.h>struct Point 
    {int x;int y;
    };// 函数接受结构体值作为参数
    void printPoint(struct Point p) 
    {printf("坐标: (%d, %d)\n", p.x, p.y);
    }int main() 
    {struct Point pt = {3, 5};printPoint(pt);return 0;
    }
    地址传递
    #include <stdio.h>struct Point 
    {int x;int y;
    };// 函数接受结构体指针作为参数
    void modifyPoint(struct Point *p) 
    {p->x = 10;p->y = 20;
    }int main() 
    {struct Point pt = {3, 5};modifyPoint(&pt);printf("修改后的坐标: (%d, %d)\n", pt.x, pt.y);return 0;
    }


http://www.ppmy.cn/embedded/159992.html

相关文章

无人机动力套(电机、电调)技术详解

无人机动力套技术主要涉及电机和电调两大核心组件&#xff0c;它们在无人机的飞行性能中起着至关重要的作用。以下是对无人机动力套技术的详细解析&#xff1a; 一、电机技术详解 1. 电机的作用&#xff1a; 电机是将电能转化为机械能的关键部件&#xff0c;其主要作用是产生…

手写MVVM框架-实现v-model(双向绑定)

上一章我们实现了&#xff0c;修改input的值后文本节点的内容发生了变化&#xff0c;还有一个v-model属于双向绑定&#xff0c;我们我们的值发生了变化的话&#xff0c;input的值也需要发生变化&#xff0c;这一章&#xff0c;我们来实现这个功能。 第一步&#xff1a;收集属性…

在x86上使用debootstrap构建龙芯环境失败的尝试

本文主要介绍在x86平台上使用debootstrap来构建龙芯平台的编译和运行环境。 本文中没有非常明显的逻辑关系&#xff0c;由于实践的时间跨度较长&#xff0c;记录的可能不完整&#xff0c;但可以作为实践过程的一侧面印证。如有相关需求&#xff0c;建议参考上一文章。如要阅读本…

吴恩达深度学习——对象检测

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 对象定位特征点检测基于滑动窗口的目标检测算法原理将全连接层转化成卷积层通过卷积实现滑动窗口检测算法 YOLOBounding Box预测交并比非极大值抑制Anchor BoxYOLO检测训练集中预…

unordered_map/set的哈希封装

【C笔记】unordered_map/set的哈希封装 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】unordered_map/set的哈希封装前言一. 源码及框架分析二.迭代器三.operator[]四.使用哈希表封装unordered_map/set后言 前言 哈…

mybatis plus 持久化使用技巧及场景

mybatis plus提供了很多强大的持久化工具&#xff0c;新手容易对这些工具使用困难&#xff0c;下面我总结了一下mybatis plus持久化的使用技巧及使用场景。 一、持久化 官方文档&#xff1a;https://baomidou.com/guides/data-interface/ &#xff08;一&#xff09;通过ser…

Hive:窗口函数(1)

窗口函数 窗口函数OVER()用于定义一个窗口&#xff0c;该窗口指定了函数应用的数据范围 对窗口数据进行分区 partition by 必须和over () 一起使用, distribute by经常和sort by 一起使用,可以不和over() 一起使用.DISTRIBUTE BY决定了数据如何分布到不同的Reducer上&#xf…

小程序插画共享平台ssm+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…