学习嵌入式第十五天
文章目录
- 构造数据类型(续上)
- 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;}