嵌入式学习day3:数组与结构体

张开发
2026/4/16 1:19:28 15 分钟阅读

分享文章

嵌入式学习day3:数组与结构体
一数组1.一维数组定义如下//一维数组未赋值的初始化为0 int arr[5]{1,2,3,4,5}; //可以用循环赋值 for (int i0; i5; i) { arr[i]i1; }数组的大小数组的字节数/数组元素的字节数代码如下//数组的大小数组的字节数/数组元素的字节数 int lensizeof(arr)/sizeof(arr[0]);用指针定义数组名可以直接当指针使用还可用指针给数组赋值实现代码如下//数组名可以直接当指针使用 int num[5]{1,2,3,4,5}; int *pnum; printf(%d\n,*p); //*p指向数组的第一个元素的值即1 printf(%d\n,p); //p指向数组的第一个元素的地址即num[0] printf(%d\n,*(p1)); //*(p1)指向数组的第二个元素的值即2 printf(%d\n,p1); //p1指向数组的第二个元素的地址即num[1] //可直接用指针给数组赋值 *p100; printf(%d\n,num[0]); //输出100数组的遍历查找最大值实现代码如下int m[]{3,2,6,7,1,67,22,978}; int max 0; for (int i0; isizeof(m)/sizeof(m[0]); i) { if (m[i]max) { max m[i]; } } printf(max%d\n,max);2.字符数组定义有两种定义方式一种是大括号一种是双引号用第一种方式字符串后不会自动加上\0因此实际长度要1第二种方式会自动加上\0不用特殊处理代码如下char name[6] {b,a,n,a,n}; //不会自动加上\0,长度要加1 printf(%c\n,name[0]); printf(%c\n,name[1]); printf(%c\n,name[2]); printf(%c\n,name[3]); printf(%c\n,name[4]); printf(%s\n,name); char name2[] banana;//会自动加上\0 printf(%s\n,name2);字符串函数1.strcpy()字符串的复制一般用来赋值代码如下char str[20]; char *p bjyxszd; strcpy(str,p); printf(%s\n,str);2.sprintf()将格式化后的字符串赋值给目标字符串实现代码如下int i100; sprintf(str,%d,i); printf(%s\n,str);3.memcpy()将源字符串的前n个字符节复制到目标字符串中实现代码如下char str2[20]; char i2a; memcpy(str2,i2,1); printf(%c\n,str2[0]); memcpy(str2,hello,6);//将hello复制到str2中包括\0,所以长度1 printf(%s\n,str2);注意输入字符串可以用fgets()可以输入空格scanf输入字符串遇到空格会自动结束输入如果想用scanf输入空格可以用scanf(%[^\n],name); 这样遇到回车才停止遇到空格不会停止4.strlen()返回字符串的长度实现代码如下int lenstrlen(HEELO); printf(长度是%d\n,len);//结果为55.strcmp()比较两个字符串是否相等返回0表示相等,其他值表示不相等,正数表示str1大于str2,负数表示str1小于str2实现代码如下int retstrcmp(name,banana); //返回0表示相等,其他值表示不相等, //正数表示name大于banana,负数表示name小于banana if(ret0){ printf(姓名是banana\n); } else{ printf(姓名不是banana\n); }6.strcat()将两个字符串连接起来实现代码如下strcat(WORLD,HELLO); printf(%s\n,str2);//结果为WORLDHELLO注意用这些函数时得加一个头文件#include string.h3.二维数组定义类似于表格初始化有三种方式实现代码如下//显式初始化 int a[2][3]{{1,2,3},{4,5,6}};//初始化2行3列的数组 //部分初始化未赋值的初始化为0 int a2[2][3]{{1},{4}}; //隐式大小判断 int a3[][3]{{1,2,3},{4,5,6}};二维数组的遍历用循环遍历实现代码如下int arr[3][3] {{1,2,3},{4,5,6},{7,8,9}}; for (int i0; i3; i) { for (int j0; j3; j) { printf(%d ,arr[i][j]); } printf(\n); }与指针的关系arr是指向arr[0]的指针即arr[0]arr[0]是指向arr[0][0]的指针即arr[0][0]。实现代码如下printf(%d\n,arr[0]);//输出arr[0][0]的地址 int *parr[0]; //p指向第一行的第一个元素的地址即arr[0][0] for (int i0; i9; i) { printf(%d ,*(pi)); }来一个经典应用转置矩阵实现代码如下int main() { int a[3][3]; for (int i0; i3; i) { for (int j0; j3; j) { scanf(%d,a[i][j]); } } int num; for (int i0; i3; i) { for (int ji; j3; j) { numa[i][j]; a[i][j]a[j][i]; a[j][i]num; } } printf(转置矩阵为\n); for (int i0; i3; i) { for (int j0; j3; j) { printf(%d ,a[i][j]); } printf(\n); } return 0; }二聚合数据类型1.结构体定义结构体里面可以包含多种数据类型甚至可以再嵌套一个结构体它里面的每个成员都有独立的内存空间。不多说直接上代码//结构体的定义struct 结构体名 { // 变量类型 变量名; // 变量类型 变量名; // ... // }; //结构体的大小取决于成员的大小和成员的对齐方式 struct Date { int day; int month; int year; }; struct Person { char name[50]; int age; float height; struct Date birthDate; };初始化struct Person p1; //初始化结构体成员 strcpy(p1.name, 王二麻子); p1.age 31; p1.height 1.85; printf(%s,%d,%.2f\n, p1.name, p1.age, p1.height);结构体数组struct Person p2[3]; //初始化结构体数组的成员 strcpy(p2[0].name, 张三); p2[0].age 20; p2[0].height 1.75; strcpy(p2[1].name, 李四); p2[1].age 21; p2[1].height 1.80; strcpy(p2[2].name, 王五); p2[2].age 22; p2[2].height 1.78; //循环打印结构体数组的成员 for (int i0; i3;i) { printf(第%d个人的Name:%s\n,i1,p2[i].name); }使用指针//使用指针指向结构体变量 struct Person *ptr p1; //通过-运算符访问结构体成员 printf(Name:%s\n,ptr-name); printf(Age:%d\n,ptr-age); //通过指针遍历结构体数组 struct Person *ptr2 p2; for (int i0; i3; i) { printf(Name:%s\n,(ptr2i)-name); }结构体的声明方式总共有5种//1. struct Date { int day; int month; int year; }; struct Date birthDate; //2. struct Date { int day; int month; int year; }d1,d2,d3; //3.结构体类型定义 typedef struct { int a; int b; int c; } MyTest; MyTest t1; typedef long long ll; ll a; 4.指针的用法 struct Node { int data; struct Node* next; }; struct Node* head; //定义一个指向Node结构体的指针 int main() { head malloc(sizeof(struct Node)); head-data 10; return 0; } //5.匿名结构体 struct { int a; int b; } s1 {10,20}; int main() { printf(%d,%d\n,s1.a,s1.b); return 0; }2.联合体定义联合体的内存共享所有成员共享同一内存只有一个成员能够在任何时刻存储值。联合体的大小取决于最大的成员大小用法代码如下union Data { int i; float f; char c[20]; };联合体内存管理的特点是所有成员共享同一块内存空间。内存大小等于最大成员的大小成员的变化会影响整个联合体。联合体节省内存但每次只能存储其中一个成员的数据适用于存储互斥的数据。3.枚举定义枚举如果不特定赋值默认第一个值为0后面依次递增。实现代码如下enum Weekday { Monday1, //默认值为0赋值过后后续的枚举值从1开始自动递增 Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; int main() { enum Weekday w1Sunday; printf(%d\n,w1);//输出7 return 0; }来点聚合的应用题目定义一个 Gender 枚举类型MALE 和 FEMALE。定义一个 Student 结构体包含以下字段o 学号 ido 姓名 name字符串长度不超过20o 性别 Gendero 成绩 score。在主函数中o 创建三个学生的实例o 初始化并打印每个学生的信息。提示使用 printf 格式化输出学生的信息。#include stdio.h #include string.h // 定义性别的枚举类型 typedef enum { MALE, // 男 FEMALE // 女 } Gender; // 定义学生结构体 typedef struct { int id; // 学号 char name[20]; // 姓名 Gender gender; // 性别 float score; // 成绩 } Student; int main() { // 创建三个学生实例 Student student1, student2, student3; // 初始化第一个学生 student1.id 1001; strcpy(student1.name, 张三); student1.gender MALE; student1.score 85.5; // 初始化第二个学生 student2.id 1002; strcpy(student2.name, 李四); student2.gender FEMALE; student2.score 92.0; // 初始化第三个学生 student3.id 1003; strcpy(student3.name, 王五); student3.gender MALE; student3.score 78.5; // 打印学生信息 printf(学号: %d, 姓名: %s, 性别: %s, 成绩: %.2f\n, student1.id, student1.name, student1.gender MALE ? 男 : 女, student1.score); printf(学号: %d, 姓名: %s, 性别: %s, 成绩: %.2f\n, student2.id, student2.name, student2.gender MALE ? 男 : 女, student2.score); printf(学号: %d, 姓名: %s, 性别: %s, 成绩: %.2f\n, student3.id, student3.name, student3.gender MALE ? 男 : 女, student3.score); return 0; }定义一个 LightState 枚举类型表示交通灯的颜色RED、YELLOW 和 GREEN。在主函数中o 定义一个变量 current_light类型为 LightStateo 使用 switch 语句模拟交通灯颜色变化逻辑红-绿-黄-红o 输出当前交通灯的颜色并循环切换交通灯颜色。提示每次输出后切换交通灯颜色可以使用简单的 for 循环来模拟变化多次。#include stdio.h #include string.h #include stdlib.h enum LightState { Red, Yellow, Green }; int main() { enum LightState current_light Red; for (int i0; i20; i) { switch (current_light) { case Red: printf(-Red); current_light Green; break; case Yellow: printf(-Yellow); current_light Red; break; case Green: printf(-Green); current_light Yellow; break; default: break; } } return 0; }定义一个 SensorType 枚举类型TEMPERATURE、HUMIDITY、PRESSURE。定义一个联合体 SensorData包含o temperaturefloato humidityint0-100o pressurefloat。在主函数中o 创建一个变量 sensor_type表示当前传感器类型o 创建一个 SensorData 变量根据传感器类型输入数据o 输出数据到控制台。提示使用 switch 根据传感器类型输入和输出相应数据。#include stdio.h #include string.h #include stdlib.h enum SensorType { TEMPERATURE, HUMIDITY, PRESSURE }; union SensorData { float temperature; int humidity; float pressure; }; int main() { enum SensorType sensor_type; union SensorData sensor_data; printf(请输入传感器类型0温度1湿度2压力); scanf(%d,sensor_type); switch (sensor_type) { case TEMPERATURE: printf(请输入温度); scanf(%f,sensor_data.temperature); break; case HUMIDITY: printf(请输入湿度); scanf(%d,sensor_data.humidity); break; case PRESSURE: printf(请输入压力); scanf(%f,sensor_data.pressure); break; default: printf(输入错误\n); break; } printf(传感器类型%s\n,sensor_typeTEMPERATURE?温度:sensor_typeHUMIDITY?湿度:压力); if (sensor_type TEMPERATURE) { printf(温度%.2f\n,sensor_data.temperature); } else if (sensor_type HUMIDITY) { printf(湿度%d\n,sensor_data.humidity); } else if (sensor_type PRESSURE) { printf(压力%.2f\n,sensor_data.pressure); } return 0; }

更多文章