当前位置: 首页 > news >正文

嵌入式学习日志(十一)

11   学习结构体

1  结构体

 1.1 类型定义

struct 结构体名 {

    数据类型 成员变量1;

    数据类型 成员变量2;

    // ...

};

        注意:结构体类型定义一般放在 main 函数外。

示例:

struct date {

    int year;

    int month;

    int day;

};

        定义了一个名为 date 的结构体类型,包含 year 、 month 、 day 三个成员变量。

1.2 结构体变量定义

struct 结构体名 变量名;

示例:

struct date d;

        定义了一个 date 类型的结构体变量 d 。

也可以嵌套定义:

struct datetime {

    struct date d;

    struct time t;

};

        定义了一个包含 date 类型成员 d 和 time 类型成员 t 的 datetime 结构体类型。

1.3 结构体元素初始化

1、全部初始化:

struct student stu = {"zhangsan", 'm', 18, 90};

2、局部初始化:

struct student stu = {

    .name = "zhangsan",

    .score = 90

};

        没有指定初始值的成员会被赋值为0。

1.4 结构体成员访问

1、结构体变量类型:

结构体变量名.成员变量名

示例:

struct date dt;

dt.year = 2025;

dt.month = 7;

dt.day = 29;

printf("Date: %d-%d-%d\n", dt.year, dt.month, dt.day);

        在这个例子中, dt  是一个  struct date  类型的变量,使用  .  操作符来访问并设置  dt  的  year 、 month  和  day  成员变量。 

2、结构体指针类型:

结构体指针变量名->成员变量名

示例:

struct student *pstu = &stu;

printf("%s\n", pstu->name);

        在这个例子中, pstu  是一个指向  struct student  类型变量  stu  的指针,使用  ->  操作符来访问并打印  stu  的  name  和  age  成员变量。 

3、注意事项:

       1、当访问结构体的成员变量时,表达式的最终类型是由该成员变量的类型决定的,而不是结构体本身的类型。例如:

struct student {

    char name[50];

    int age;

    float score;

};

struct student stu;

stu.age = 20;

        在这个例子中, stu.age  的类型是  int ,因为  age  成员变量的类型是  int 。无论结构体本身是什么类型,访问成员变量时的类型都是该成员变量的类型。

        同样地,如果有一个指向结构体的指针:

struct student *pstu = &stu;

pstu->score = 95.5;

        pstu->score  的类型是  float ,因为  score  成员变量的类型是  float 。

        2、确保在访问结构体成员之前,结构体变量或指针已经正确初始化。

        3、如果一个结构体指针想通过解引用指针来访问成员变量,也可以使用  (*结构体指针变量名).成员变量名  的形式,但这种方式不如  ->  操作符简洁。

        4、对于嵌套结构体(结构体中包含另一个结构体作为成员),可以连续使用  .  或  ->  操作符来访问嵌套结构体的成员。例如:

struct datetime {

    struct date d;

    struct time t;

};

struct datetime dt;

dt.d.year = 2025;

dt.t.hour = 12;

或者通过指针:

struct datetime *pdt = &dt;

pdt->d.year = 2025;

pdt->t.hour = 12;

1.5 结构体的存储

结构体的存储遵循内存对齐原则:

- 结构体成员必须存放在内存地址为自身类型整数倍的内存单元中(为保证CPU一次性把数据取完)。

- 结构体大小必须为自身最大类型的整数倍( float 、 double 也用 int 或 long 等整数倍来对齐)。

示例:

struct student {

    char name[32];

    char sex;

    int age;

    int score;

};

 sizeof(struct student) 的大小为44,而不是各成员变量大小简单相加(32 + 1 + 4 + 4 = 41)。

1.6 结构体传参

        结构体传参时,建议使用指针传参,避免大空间拷贝。

示例:

struct student ret;

memset(&ret, 0, sizeof(ret));

        使用 memset 函数将结构体 ret 的所有成员初始化为0。

http://www.dtcms.com/a/304369.html

相关文章:

  • 【windows系统服务端ssh免密登录配置坑】
  • 低空经济应用-无人机拉格朗日粒子追踪技术
  • 阿里云上进行k8s集群的配置
  • 电脑没有声音了怎么恢复 快速解决音频故障
  • 使用 Databend Cloud 归档 OceanBase 数据数据库
  • ElasticStack技术栈概述及Elasticsearch8.2.2集群部署并更换JDK版本为openjdk-17
  • 路由器路由协议详解:从 RIP 到 OSPF 的技术演进
  • TRACERT命令
  • 迅为RK3588开发板安卓GPIO调用-APP运行测试
  • HarmonyOS-ArkUI Web控件基础铺垫6--TCP协议- 流量控制算法与拥塞控制算法
  • LeetCode Hot 100 搜索二维矩阵
  • 抽象工厂模式 Abastract Factory Pattern
  • 从本地 Docker 部署的 Dify 中导出知识库内容(1.6版本亲测有效)
  • 设计一个高可用、可拓展、监控报警系统,使用普罗米修斯和grafana,并给出go实现
  • 无穿戴动作捕捉技术:驱动历史活化、乐园叙事与教育沉浸的文旅利器
  • JVM知识点(2)
  • 从协议栈到ath12k_mac_op_tx的完整调用路径
  • Leetcode——41. 缺失的第一个正数
  • 前端学习日记(十五)
  • 深入理解图像插值:从原理到应用
  • 答题抽奖活动小程序技术复盘
  • unittest错误重跑与测试用例跳过机制
  • 操作系统-lecture2(操作系统结构)
  • Unity的GameObject.Instantiate的使用
  • 津发科技带你了解皮肤电信号中的SCL与SCR
  • SuperClaude Framework 使用指南
  • Ubuntu20.04子系统
  • RPG增容2.尝试使用MMC根据游戏难度自定义更改怪物的属性(二)
  • 基于STM32的PD抓包器
  • Vue3 状态管理新选择:Pinia 从入门到实战