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

学习嵌入式第十五天

文章目录

  • 构造数据类型(续上)
    • 1.结构体
      • 7.结构体数组
      • 8.结构体数组初始化
      • 9.结构体数组传参
    • 2.共用体(联合体)
      • 1.类型定义
      • 2.使用共用体判断内存大小端
    • 3.枚举
      • 1.定义
      • 2.特性
    • 位运算符
    • 内存管理
  • 习题

构造数据类型(续上)

1.结构体

7.结构体数组

  • 数组元素个数必须是常量

    数据类型 数组名[元素个数]

8.结构体数组初始化

struct student s[3] = {{"zhangsan",'m',18,90},{"lisi",'f',16,100},{"wanger",'m',18,95},
};
struct student stu[3] = {[0] = {.name = "zhaowu",.score = 88,},[2] = {.name = "chenliu",.score = 98,},};

9.结构体数组传参

int fun(struct student *pstu,int len);

练习:输入学生信息并能够输出

代码实现:

#include<stdio.h>struct student{char name[32];char sex;int age;int score;
};int getstuinfo(struct student *pstu,int len){int i = 0;for(i = 0;i < len;i++){
#if 0	printf("姓名:%s\n",pstu->name);printf("性别:%c\n",pstu->sex);printf("年龄:%d\n",pstu->age);printf("分数:%d\n",pstu->score);pstu++;printf("姓名:%s\n", (*(pstu+i)).name);printf("性别:%c\n", (*(pstu+i)).sex);printf("年龄:%d\n", (*(pstu+i)).age);printf("成绩:%d\n", (*(pstu+i)).score);printf("姓名:%s\n", (pstu+i)->name);printf("性别:%c\n", (pstu+i)->sex);printf("年龄:%d\n", (pstu+i)->age);printf("成绩:%d\n", (pstu+i)->score);
#endifprintf("姓名:%s\n", pstu[i].name);printf("性别:%c\n", pstu[i].sex);printf("年龄:%d\n", pstu[i].age);printf("成绩:%d\n", pstu[i].score);}}int main(void){struct student stu[3] = {{"wangmazi",'m',19,98},{"zhangsan",'f',18,90},};struct student s[3] = {[0] = {.name = "zhaosi",.score = 88,},[2] = {.name = "lisi",.score = 90,},};getstuinfo(stu,3);return 0;
}

2.共用体(联合体)

1.类型定义

union 共用体名{数据类型1 成员变量1;数据类型2 成员变量2;......
};

与结构体的区别:共用体每个成员变量的空间共享,主要用于函数传参,结构体每个成员变量的空间独立

2.使用共用体判断内存大小端

  • 内存低地址存放低数据位,内存高地址存放高数据位,内存小端
  • 内存低地址存放高数据位,内存高地址存放低数据位,内存大端

代码实现:

#include<stdio.h>union s {char a;int b;
};int main(void){union s s1;s1.b = 1;if(s1.a){printf("小端存储\n");}else{printf("大端存储\n");}return 0;
}

3.枚举

  • 定义一些枚举常量

1.定义

enum 枚举类型{常量1,常量2......
}

2.特性

  • 枚举常量均为int类型,且第一个枚举常量的值默认为0,
  • 枚举常量可以在定义时被赋值

练习:输入今天是周几,输出限行尾号

#include<stdio.h>enum weekday {monday = 1,tuesday,wednesday,thusday,friday,saturday,sunday,
};int main(void){enum weekday day;printf("请输入今天是周几\n");scanf("%d",(int*)&day);switch(day){case monday:printf("尾号1和6限行\n");break;case tuesday:printf("尾号2和7限行\n");break;case wednesday:printf("尾号3和8限行\n");break;case thusday:printf("尾号4和9限行\n");break;case friday:printf("尾号5和0限行\n");break;case saturday:case sunday:printf("不限行\n");}return 0;
}

位运算符

类型

运算符含义
&按位与(与0为0)
|按位或(或1为1)
^按位异或(相同为0,相异为1)
~按位取反
<<左移(左移n位就是让数据*2的n次方)
>>右移(右移n位就是让数据/2的n次方)

使用场景

  • 将一数据某一位置1

    num = num | (1 << n)
    
  • 将一数据某一位置0

    num = num & ~(1 << n)
    

内存管理

堆区空间操作

  • malloc函数

    1.申请一段堆区空间

    2.申请成功返回申请堆区空间的首地址,失败返回NULL

  • free函数

    释放申请的堆区空间

内存泄漏

  • 只申请空间,使用完毕后,不释放空间,导致可用空间变少,会产生内存泄漏

习题

一个班有四名学生,有五门课程。

1.封装函数求第一门课的平均分

2.封装函数找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均分

3.封装函数找出平均分在90以上或全部课程成绩在85分以上的学生

代码实现:

#include<stdio.h>
struct scores {int scorearray[5];};
struct student {char name[32];int id;struct scores all_scores;
};
int get_score_svg(struct student *pstu, int len) {float svg = 0;for (int i = 0; i < len; i++) {svg += (pstu + i)->all_scores.scorearray[0];}svg /= len;printf("第一门科目平均分:%.2f\n", svg);return 0;
}
int get_filestu(struct student* pstu,int len) {int i = 0;int j = 0;int sum = 0;float svg = 0;for (i = 0; i < len; i++) {for (j = 0; j < 5; j++) {if ((pstu + i) ->all_scores.scorearray[j] < 60) {sum++;}}if (sum > 2) {printf("姓名:%s\n学号:%d\n", pstu[i].name, pstu[i].id);for (j = 0; j < 5; j++){svg += (pstu + i)->all_scores.scorearray[j];printf("score%d = %d\n", j + 1, pstu[i].all_scores.scorearray[j]);}printf("平均分:%.2f\n", svg / 5.0);}sum = 0;svg = 0;}printf("以上是不及格学生的信息\n");return 0;
}
int get_goodstu(struct student* pstu, int len) {int i = 0;int j = 0;int sum = 0;float svg = 0;for (i = 0; i < len; i++) {for (j = 0; j < 5; j++) {if ((pstu + i)->all_scores.scorearray[j] >= 85) {sum++;}}if (sum == 5) {printf("姓名:%s\n学号:%d\n", pstu[i].name, pstu[i].id);for (j = 0; j < 5; j++) {printf("score%d = %d\n", j + 1, pstu[i].all_scores.scorearray[j]);}}else {for (j = 0; j < 5; j++) {svg += (pstu + i)->all_scores.scorearray[j];}svg /= 5;if (svg >= 90) {printf("姓名:%s\n学号:%d\n", pstu[i].name, pstu[i].id);for (j = 0; j < 5; j++) {printf("score%d = %d\n", j + 1, pstu[i].all_scores.scorearray[j]);}}}sum = 0;svg = 0;}printf("以上是优秀学生的信息\n");return 0;
}
int main(void) {struct student stu[5] = {{"zhangsan",1,{94,65,49,50,44}},{"lisi",2,{46,100,72,97,45} },{"wangmazi",3,{95,99,98,100,90}},{"zhaowu",4,{100,85,84,89,99} },{"qianliu",5,{52,98,85,41,52}},};get_score_svg(stu, 5);get_filestu(stu, 5);get_goodstu(stu, 5);return 0;}
http://www.lryc.cn/news/605081.html

相关文章:

  • 【PostgreSQL内核学习:WindowAgg 帧优化与节点去重】
  • 李宏毅2025《机器学习》-第九讲:大型语言模型评测的困境与“古德哈特定律”**
  • Linux 中,命令查看系统版本和内核信息
  • LNN+XGBoost:优化多层供应链订购:缓解牛鞭效应
  • 力扣209:长度最小的子数组
  • 光谱相机自动调焦曝光控制
  • 基于Rust与HDFS、YARN、Hue、ZooKeeper、MySQL
  • Linux 系统原理深度剖析与技术实践:从内核架构到前沿应用
  • npm run dev 启动项目 报Error: listen EACCES: permission denied 0.0.0.0:80 解决方法
  • Spring boot 打包成docker image 镜像
  • vue create 项目名 和 npm init vue@latest 创建vue项目的不同
  • 3GPP TS 38.331 V18.6.0 (2025-06)中文版
  • CMS框架GetShell
  • Web3:以太坊虚拟机
  • 网络的学习 2 Socket
  • 发那科机器人P点位置号码自动变更功能为禁用状态
  • python基础:用户输入和 while 循环
  • 【机器学习】pycharm使用SSH SFTP 远程连接 ubuntu服务器 进行开发+调试+数据训练
  • IBus vs. Fcitx5:一场 Linux 输入法框架的正面交锋
  • 在 Kubernetes 上部署 Label Studio
  • Apache Kafka核心组件详解
  • 当人生低谷无人帮助时,如何独自奏响人生乐章
  • 借助 Wisdom SSH AI 助手构建 Linux 容器化开发流水线
  • 虚实共生的智能革命:元宇宙、物联网与 AI 融合生态全景图谱
  • Vue 3 入门教程 2- Vue 组件基础与模板语法
  • 推客系统开发全流程解析:从概念到落地的完整指南
  • 论文Review LSLAM BALM | 经典激光SLAM方案!港大MARS出品!RAL2021 | 激光BA优化
  • RocketMQ 核心特性解析及与 Kafka区别
  • Spring AI 海运管理应用第2部分
  • Centos 7.9安装部署cobbler-自动化部署服务器完整教程